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 包括颜色排版形状属性。

自定义主题

相关推荐
工程师老罗8 小时前
如何在Android工程中配置NDK版本
android
Libraeking12 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位12 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen12314 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs15 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob15 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔15 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99615 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly17 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首17 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节