小工具知识网

当前位置: 首页 > 行业知识 > 7、Copmose自定义颜色和主题切换

行业知识

7、Copmose自定义颜色和主题切换

2026-11-15 21:00:57 来源:互联网转载

Copmose自定义颜色和主题切换

一起颜色���设置的都是在res/values/colors里面去做颜色, 但是当使用compose的时候,抛弃了使用了ui.theme底下的Color.kt和Theme.kt 但是默认使用的是MaterialTheme主题,里面的颜色字段不能定义,因此需要自定义这个:

()

我先查看MaterialTheme 里面的颜色主题是怎么定义的,然后照葫芦画瓢。

android官网 对应自定义的解释,可以根据官网来进行操作

()

Compose 中的自定义设计系统

CustomColorScheme.kt

import androidx.compose.runtime.Stableimport androidx.compose.runtime.getValueimport androidx.compose.runtime.mutableStateOfimport androidx.compose.runtime.setValueimport androidx.compose.ui.graphics.Color@Stableclass CustomColorScheme(    pureWhite: Color,    pureBlack: Color,    homeButtonBg: Color,    textColor: Color,......// 根据项目需要去添加字段) {    var pureWhite by mutableStateOf(pureWhite)        private set    var pureBlack by mutableStateOf(pureBlack)        private set    var homeButtonBg by mutableStateOf(homeButtonBg)        private set    var textColor by mutableStateOf(textColor)        private set......    fun update(colors: CustomColorScheme) {        this.pureWhite = colors.pureWhite        this.pureBlack = colors.pureBlack        this.homeButtonBg = colors.homeButtonBg        this.textColor = colors.textColor        ......    }    fun copy() = CustomColorScheme(        pureWhite,        pureBlack,        homeButtonBg,        textColor,......    )}

然后再Theme.kt里面添加,DarkCustomColorScheme 和 LightCustomColorScheme实现自定义的颜色

// DarkColorScheme LightColorScheme 这个两个是系统默认的,使用的是MaterialThemeprivate val DarkColorScheme = darkColorScheme(    primary = Purple80,    secondary = PurpleGrey80,    tertiary = Pink80)private val LightColorScheme = lightColorScheme(    primary = Purple40,    secondary = PurpleGrey40,    tertiary = Pink40    /* Other default colors to override    background = Color(0xFFFFFBFE),    surface = Color(0xFFFFFBFE),    onPrimary = Color.White,    onSecondary = Color.White,    onTertiary = Color.White,    onBackground = Color(0xFF1C1B1F),    onSurface = Color(0xFF1C1B1F),    */)/** Color Scheme object */// 黑夜private val DarkCustomColorScheme = CustomColorScheme(    // temp use light    pureBlack = NeutralBlack0100,    pureWhite = PrimaryPureWhite,    homeButtonBg = NeutralGrey8015,    textColor = NeutralGrey2076, ) 白天private val LightCustomColorScheme = CustomColorScheme(    pureBlack = NeutralBlack0100,    pureWhite = PrimaryPureWhite,    homeButtonBg = NeutralGrey8015,    textColor = NeutralGrey2076,)

之后继续添加下面的,这些

@Composablefun ProvideAppColors(colors: CustomColorScheme, content: @Composable () -> Unit) {    val colorPalette = remember {        colors.copy()    }    colorPalette.update(colors)    CompositionLocalProvider(LocalCustomColors provides colorPalette, content = content)}// create static CompositionLocalprivate val LocalCustomColors = staticCompositionLocalOf {    DarkCustomColorScheme}// 可以自己自定义添加enum class CustomStyleScheme {    // theme list    DARK, LIGHT}private val CustomStyleScheme.theme: Pair    get() = when (this) {        CustomStyleScheme.DARK -> DarkColorScheme to DarkCustomColorScheme        CustomStyleScheme.LIGHT -> LightColorScheme to LightCustomColorScheme    }// 这个添加了@Composable 说明是可组合函数,界面可以拿他进行设置颜色@Composablefun AppTheme(    /* Can use 'var pallet by mutableStateOf(CustomStyleScheme.LIGHT)' to choose app theme    *  now use isSystemInDarkTheme to judge dark or light    */    darkTheme: Boolean = isSystemInDarkTheme(),//    customTheme: CustomStyleScheme = AppTheme.pallet, //    content: @Composable () -> Unit) {    val customTheme = when {        darkTheme -> CustomStyleScheme.DARK        else -> CustomStyleScheme.LIGHT    }    val (colorScheme, customColors) = customTheme.theme    ProvideAppColors(colors = customColors) {        MaterialTheme(            colorScheme = colorScheme,            typography = Typography,            content = content        )    }}/** AppTheme manager */object AppTheme {    val customColors: CustomColorScheme        @Composable        get() = LocalCustomColors.current    var pallet by mutableStateOf(CustomStyleScheme.LIGHT)}

看看默认生成的是怎么写的,跟上面的AppTheme差不多,只是我多了一个选择

@Composablefun ExtTheme(    darkTheme: Boolean = isSystemInDarkTheme(),    // Dynamic color is available on Android 12+    dynamicColor: Boolean = true,    content: @Composable () -> Unit) {    val colorScheme = when {        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {            val context = LocalContext.current            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)        }        darkTheme -> DarkColorScheme        else -> LightColorScheme    }    val view = LocalView.current    if (!view.isInEditMode) {        SideEffect {            val window = (view.context as Activity).window            window.statusBarColor = colorScheme.primary.toArgb()            WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme        }    }    MaterialTheme(        colorScheme = colorScheme,        typography = Typography,        content = content    )}

上一篇:一文掌握帧频,概念、作用与影响详解!

下一篇:帝国CMS中iframe功能的关闭方法