Compose 的 Modifiers 属性

Modifiers 可以修饰一个 composable。

在前面基础组件中,可能或多或少见过 Modifier,但不知道它是干什么的,那么这一节我们来看看 Modifier 到底能做哪些事情呢!

  • 改变 composable 的尺寸、布局、动作和外观
  • 添加信息,比如无障碍辅助信息
  • 处理用户输入
  • 增加高级交互,比如点击、滚动、拖动或缩放等等
kotlin 复制代码
@Composable
fun TextSample() {
    Text(
        text = "Hello World!",
        modifier = Modifier
            .background(Color.Red)
            .padding(8.dp),
        style = TextStyle(background = Color.Green)
    )
}

在上面的代码中,我们给文本添加了绿色背景,然后通过 Modifier 设置了两个修饰

  • background 设置控件的背景颜色
  • padding 设置内间距

modifiers 的先后顺序

修饰的先后顺序是会影响到修饰效果的。比如上面的例子中,如果把 padding 和 background 的顺序调换一下,红色背景将不会显示出来。

内置的 Modifiers

系统内置了一些 modifiers 供用户使用

  • padding 和 size

    通常情况下布局会根据其内容大小来进行显示。但是你可以通过 size 来控制布局的大小

    kotlin 复制代码
    @Composable
    fun ArtistCard(/*...*/) {
        Row(
            modifier = Modifier.size(width = 400.dp, height = 100.dp)
        ) {
            Image(/*...*/)
            Column { /*...*/ }
        }
    }

如果指定的大小不满足父布局的约束,则尺寸将会无效。如果强制设置请使用而不考虑父控件约束,可以使用 requiredSize

ini 复制代码
@Composable
fun ImageSample() {
    Column {
        //父控件设置尺寸为100dp
        Column(modifier = Modifier.size(100.dp)) {
            Image(
                painter = painterResource(id = R.drawable.newbanner4),
                contentDescription = null,
                modifier = Modifier.size(150.dp),//此时子控件使用 size 设置150dp 是无效的
                colorFilter = ColorFilter.tint(Color.Red, blendMode = BlendMode.Color)
            )
        }
        //父控件设置尺寸为100dp
        Column(modifier = Modifier.size(100.dp)) {
            Image(
                painter = painterResource(id = R.drawable.newbanner4),
                contentDescription = null,
                modifier = Modifier.requiredSize(150.dp),//此时子控件需要使用 requiredSize 设置为150dp才有效
                colorFilter = ColorFilter.tint(Color.Red, blendMode = BlendMode.Color)
            )
        }
    }
}

如图所示:上面的图片是父布局控制为100dp,图片设置150dp 无效。下面的图片使用 requiredSize 设置150dp 后就有效了。

  • fillMaxWidth

    如果你想让填满父布局,可以使用 fillMaxWidth 和 fillMaxHeight 或直接使用 fillMaxSize

  • offset

    如果想要设置组件基于现在位置的偏移,可以通过 Modifier.offset()来设置 x 和 y 值

Modifier作用域

在 Compose 中,modifer 是存在作用域的,有一些modifier 只能在特定组件中才能使用。比如 matchParentSize 只能在 BoxScope 中使用。

更多

写给初学者的Jetpack Compose教程,Modifier

官方 Modifiers 介绍

Full list of modifiers

相关推荐
MiyamuraMiyako2 小时前
Compose:从自动滚动到双锚点 LazyLayout
android·android jetpack
杉氧3 天前
Compose 渲染内核 (3):Slot Table 与 Gap Buffer —— 极速重组的数学艺术
android·架构·android jetpack
alexhilton4 天前
Kotlin DSL深度解析:从Gradle脚本到构建你自己的DSL
android·kotlin·android jetpack
杉氧6 天前
Framework 补完计划 (2):BufferQueue 与 SurfaceFlinger —— 像素的跨进程“接力赛”
android·架构·android jetpack
我命由我123457 天前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
我命由我123457 天前
Android 构建项目问题:XML 片段出错,com.ctc.wstx.exc.WstxUnexpectedCharException
android·xml·android studio·android jetpack·android-studio·android runtime
杉氧9 天前
跨平台资源管理:一套代码如何搞定 Android、iOS 和 Web 的图片与多语言?
android·架构·android jetpack
杉氧10 天前
兼容与共生:如何在旧项目中优雅地引入 Compose?
android·架构·android jetpack
杉氧10 天前
性能优化实战:如何定位冗余重组并榨干 Compose 的每一帧性能?
android·架构·android jetpack
alexhilton11 天前
将应用迁移到Navigation 3:痛点、加班和紧急修复
android·kotlin·android jetpack