跳转到内容

主题系统

Miuix 提供了一套完整的主题系统,使您能够轻松地在整个应用中保持一致的设计风格。整个主题系统由颜色方案和文本样式组成。

使用 MiuixTheme

使用 ThemeController 控制配色模式,然后用 MiuixTheme 包裹内容:

kotlin
@Composable
fun App() {
    // 可用模式:System、Light、Dark、MonetSystem、MonetLight、MonetDark
    val controller = remember { ThemeController(ColorSchemeMode.System) }
    MiuixTheme(controller = controller) { /* 内容 */ }
}

使用 ColorSchemeMode.System / ColorSchemeMode.MonetSystem 时会自动跟随系统深色模式。

具体方式

  • 动态取色 (Monet)

    使用 ThemeControllerMonet 模式启用动态取色。

    • 如果提供了 keyColor,将从该种子颜色生成配色方案。
    • 如果 keyColornull(默认),则尝试使用系统的壁纸颜色(Android "Material You")。
    kotlin
    @Composable
    fun AppWithMonet() {
        val controller = remember {
            ThemeController(
                ColorSchemeMode.MonetSystem, // 或 MonetLight、MonetDark
                // keyColor = Color(0xFF3482FF) // 可选:自定义种子颜色
            )
        }
        MiuixTheme(controller = controller) { /* 内容 */ }
    }
  • 调色板风格与颜色规范

    通过 paletteStylecolorSpec 自定义 Monet 动态取色使用的调色板风格和颜色规范:

    kotlin
    val controller = remember {
        ThemeController(
            ColorSchemeMode.MonetSystem,
            keyColor = Color(0xFF3482FF),
            paletteStyle = ThemePaletteStyle.Vibrant,
            colorSpec = ThemeColorSpec.Spec2025
        )
    }
    MiuixTheme(controller = controller) { /* 内容 */ }

    提示

    ThemeColorSpec.Spec2025 仅由 TonalSpotNeutralVibrantExpressive 调色板风格支持。其他风格会自动降级为 Spec2021

  • 手动控制深色模式

    使用 isDark 参数显式控制深色状态,覆盖系统设置。

    kotlin
    val controller = remember {
        ThemeController(
            ColorSchemeMode.System,
            isDark = true // 强制深色模式
        )
    }
  • Controller 中的自定义配色

    您也可以直接将自定义的 lightColorsdarkColors 传递给 ThemeController

    kotlin
    val controller = remember {
        ThemeController(
            ColorSchemeMode.System,
            lightColors = myLightColors,
            darkColors = myDarkColors
        )
    }
  • 平滑圆角

    默认情况下,Miuix 对所有组件使用 G2 连续性平滑圆角。将 smoothRounding 设为 false 可回退到标准 RoundedCornerShape,以在低端设备上获得更好的 HWUI 渲染性能:

    kotlin
    MiuixTheme(
        controller = controller,
        smoothRounding = false // 禁用 G2 连续性圆角
    ) { /* 内容 */ }
  • 直接使用

    直接传入颜色方案到 MiuixTheme(colors = ...),用于在不使用 Controller 的情况下完全自定义:

    kotlin
    @Composable
    fun AppWithColors() {
        val colors = lightColorScheme() // 或 darkColorScheme()
        MiuixTheme(colors = colors) { /* 内容 */ }
    }

ThemeController

ThemeController 管理当前 Miuix 主题的配色方案。

ThemeController 属性

属性名类型说明默认值
colorSchemeModeColorSchemeMode配色模式ColorSchemeMode.System
lightColorsColors浅色配色方案lightColorScheme()
darkColorsColors深色配色方案darkColorScheme()
keyColorColor?动态取色的种子颜色。null 时使用系统壁纸颜色null
colorSpecThemeColorSpecMaterial 颜色规范版本ThemeColorSpec.Spec2021
paletteStyleThemePaletteStyle动态取色的调色板风格ThemePaletteStyle.TonalSpot
isDarkBoolean?覆盖系统深色模式。null 时跟随系统null

ColorSchemeMode

说明
System跟随系统浅色/深色设置
Light强制浅色模式
Dark强制深色模式
MonetSystem动态取色,跟随系统浅色/深色
MonetLight动态取色,强制浅色模式
MonetDark动态取色,强制深色模式

ThemePaletteStyle

支持 Spec2025说明
TonalSpot默认 Material You 风格,平衡的色调变化
Neutral柔和、低彩度调色板
Vibrant高彩度、鲜艳调色板
Expressive大胆且富有艺术感的创意配色
Rainbow广谱多色相调色板
FruitSalad活泼的多色相调色板
Monochrome单色灰度调色板
Fidelity紧密匹配种子颜色
Content从内容颜色派生,最大程度保持准确性

ThemeColorSpec

说明
Spec2021原始 Material Design 3 颜色规范
Spec20252025 更新版颜色规范(仅 TonalSpot、Neutral、Vibrant、Expressive 支持)

MiuixTheme 对象

通过 MiuixTheme 对象访问当前主题值:

kotlin
val colors = MiuixTheme.colorScheme
val textStyles = MiuixTheme.textStyles
val mode = MiuixTheme.colorSchemeMode
val isDynamic = MiuixTheme.isDynamicColor
属性类型说明
colorSchemeColors当前颜色方案
textStylesTextStyles当前文本样式
colorSchemeModeColorSchemeMode?当前配色模式(使用直接 colors 重载时为 null)
smoothRoundingBoolean是否启用 G2 连续性平滑圆角
isDynamicColorBoolean当前模式是否为 Monet 动态取色模式

自定义主题

可以通过以下方式进行主题自定义:

  • 通过 ThemeController(ColorSchemeMode.*) 选择配色模式。
  • 选择动态配色:MonetSystem / MonetLight / MonetDark
  • 通过 paletteStyle 选择调色板风格,通过 colorSpec 选择颜色规范。
  • 传入 textStyles 覆盖文本样式:
kotlin
val customTextStyles = defaultTextStyles(
    title1 = TextStyle(
        fontSize = 36.sp,
        fontWeight = FontWeight.Bold
    ),
    // 其他文本样式...
)

val controller = remember { ThemeController(ColorSchemeMode.Light) }
MiuixTheme(
    controller = controller,
    textStyles = customTextStyles
) {
    // 您的应用内容
}

跟随系统深色模式

跟随系统深色模式已内置,使用 ColorSchemeMode.System 即可:

kotlin
@Composable
fun MyApp() {
    val controller = remember { ThemeController(ColorSchemeMode.System) }
    MiuixTheme(controller = controller) {
        // 应用内容
    }
}

变更日志

基于 Apache-2.0 许可发布