Android---Jetpack Compose学习004

CompositionLocal

通常情况下,在 Compose 中,数据以参数形式向下流经整个界面树传递给每个可组合函数。但是,对于广泛使用的常用数据(如颜色或类型样式),这可能会很麻烦。

为了支持无需将颜色作为显式参数依赖项层层传递给大多数可组合项,Compose 提供了 CompositionLocal ,可让你创建以树为作用域的具名对象,这可以用作让数据流经界面树的一种隐式方式。

我们可以通过 MaterialTheme 的 colors、shapes 和 typography 属性访问的 LocalColors、LocalShapes 和 LocalTypography 属性。

这些属性都不需要层层往下传递,而是可以在任何一个组件中直接使用, 如下代码所示:

如需为 CompositionLocal 提供新值,请使用 CompositionLocalProvider 及其 providers infix 函数。

示例:有 4 个 Text,但是他们的透明度不一样

CompositionLocal 的 current 值对应于该组合部分中的某个祖先提供的最接近的值。

例如,上面代码中,第一个 Text() 最近的祖先是 MaterialTheme(),而在 MaterialTheme 中默认设置 LocalContentAlpha 为 1f。

而此时提供的 current 值就是 high = 1f

依次类推,第2、3个文本最近的祖先是我们设置的第一个 current ,即 medium = 0.74f;第4个文本最近的祖先是我们设置的第二个 current,即 disabled = 0.38f

自定义CompositionLocal

示例:有两个 Card ,分别设置不同 elevation(z 轴上的海拔) 属性。将 elevation 定义为自己的 CompositonLocal,即 LocalElevations。右边第一个 Mycard 的海拔比较高,而第二个 MyCard 的海拔较低。

  1. MyCard.kt
Kotlin 复制代码
//TODO 自定义一个 CompositionLocal
data class Elevations(val card : Dp = 0.dp)
val LocalElevations = compositionLocalOf { Elevations() }

// 初始化一些预定值
object CardElevation{
    val high : Elevations
        get() = Elevations(card = 10.dp)
    val middle : Elevations
        get() = Elevations(card = 5.dp)
    val low : Elevations
        get() = Elevations(card = 1.dp)
}

@Composable
fun MyCard(
    elevation : Dp = LocalElevations.current.card,
    backgroundColor : Color,
    content : @Composable () -> Unit
){
    Card (
        elevation = elevation, // 海拔,一种阴影效果
        backgroundColor = backgroundColor,
        content = content,
        modifier = Modifier.size(200.dp)
    )
}
  1. CompositionLocalSample.kt
Kotlin 复制代码
@Composable
fun CompositionSample3(){
    Column {
        // TODO 使用自定义组件 MyCard, 自定义 Elevation 设置为 high = 10.dp
        CompositionLocalProvider(LocalElevations.provides(CardElevation.high)) {
            MyCard(
                backgroundColor = MaterialTheme.colors.onSurface.copy(alpha = 0.05f),

                ) {

            }
        }
        // TODO 使用自定义组件 MyCard, 自定义 Elevation 设置为 low = 2.dp
        CompositionLocalProvider(LocalElevations provides CardElevation.low) {
            MyCard(
                backgroundColor = MaterialTheme.colors.onSurface.copy(alpha = 0.05f),

                ) {

            }
        }


    }
}
  1. MainActivity.kt 里使用 CompositionLocalSample

Material Design

Material Design 是一个用于创建数字界面的综合设计体系, Material Design 组件(按钮、卡片、开关)建立在 Material Theming 之上,Material theme 包括颜色排版形状属性。

自定义主题

相关推荐
Lei活在当下7 小时前
Codex 工程化实践指南:深入理解 AGENTS.md、SKILL.md 与 MCP
android·openai·ai编程
修炼者8 小时前
Toast的显示流程
android
simplepeng11 小时前
Room 3.0 KMP Alpha-01
android·kotlin·android jetpack
Lei活在当下11 小时前
Windows 下 Codex 高效工作流最佳实践
android·openai·ai编程
fatiaozhang952711 小时前
基于slimBOXtv 9.19.0 v4(通刷晶晨S905L3A/L3AB芯片)ATV-安卓9-完美版线刷固件包
android·电视盒子·刷机固件·机顶盒刷机·晶晨s905l3ab·晶晨s905l3a
私房菜12 小时前
Selinux 及在Android 的使用详解
android·selinux·sepolicy
一只特立独行的Yang13 小时前
Android中的系统级共享库
android
两个人的幸福online13 小时前
php开发者 需要 协程吗
android·开发语言·php
修炼者14 小时前
WindowManager(WMS)构建全局悬浮窗
android
xiaoshiquan120615 小时前
Android Studio里,SDK Manager显示不全问题
android·ide·android studio