Compose Modifier修饰符绝对详细的解说,学不会你打我表弟

简介: Compose Modifier修饰符绝对详细的解说,学不会你打我表弟

Modifier


Modifier 可以被翻译为修饰符,可以用来修饰以下内容:

  • 更改可组合项的大小、布局、行为和外观
  • 添加信息,如无障碍标签
  • 处理用户输入
  • 添加高级互动,如使元素可点击、可滚动、可拖动或可缩放


item 代码案例


第三节属性扩展中的案例都是基于本节中 item 方法的形参进行赋值得到的

有一些属性我觉得初学暂不重要,并没有深入研究,见谅

item1

  1. item1 代码
@Composable
fun item1(m: Modifier) {
    Column(
        modifier = Modifier.fillMaxSize(1f),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Box(
            modifier = m
                .size(100.dp)
                .background(color = Color.Red),
            contentAlignment = Alignment.Center
        ) {
            Text(
                text = "安安安安卓",
                textAlign = TextAlign.Center,
                style = TextStyle(color = Color.White)
            )
        }
        Spacer(modifier = Modifier.height(10.dp))
    }
}
复制代码


  1. item 默认的展示效果如下:

image.png


Modifier 所有扩展方法详解


selectable(compose 实现单选)

这里起初我是没头绪的,就拼了命的百度找资料的,但是说实话一篇讲这里的文章都没有。所以只能去官网翻译官方文档了。基本上花了半小时才搞明白啥意思。眼睛又废了,本周计划的 Livedata 源码也讲不了了

总的来说 selectable 就是用来实现单选的,可作为 RadioGroup 使用,也可作为 TabView 使用。


  1. 代码
val icons = listOf<Triple<Int, Int, String>>(
        Triple(R.drawable.apple, R.drawable.lufeicry, "海贼王"),
        Triple(R.drawable.nameismile, R.drawable.nameicry, "娜美"),
        Triple(R.drawable.luobinsmile, R.drawable.luobincry, "罗宾")
    )
    var selectedItem = remember {
        mutableStateOf(icons[0])
    }
    Column(
        modifier = Modifier.fillMaxSize(1f),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Row {
            Text(
                text = "公众号:\"安安安安卓\",选择:",
                style = TextStyle(
                    color = Color.Black, fontSize = 15.sp
                ),
                modifier = Modifier.weight(0.7f)
            )
            Text(
                text = selectedItem.value.third,
                style = TextStyle(color = Color.Red, fontSize = 25.sp),
                modifier = Modifier.weight(0.3f)
            )
        }
        Row(
//            modifier = Modifier
//                .selectableGroup(),
            horizontalArrangement = Arrangement.SpaceAround
        ) {
            icons.forEach {
                val selected = selectedItem.value == it
                Image(
                    painter = painterResource(id = if (selected) it.first else it.second),
                    contentDescription = null,
                    modifier = Modifier
                        .selectable(
                            selected = selected,
                            enabled = true,
                            role = null,
                            onClick = {
                                selectedItem.value = it
                            })
                        .size(100.dp)
                )
            }
        }
    }
复制代码


  1. 效果

image.png


fillMaxSize

  1. 代码
item1(m = Modifier.background(color = Color.Blue).fillMaxSize(0.75f))
复制代码


  1. 效果

设置属性后填充了父容器 0.75 倍的大小

image.png


height

  1. 代码
item1(m = Modifier.background(color = Color.Blue).height(30.dp))
复制代码
  1. 效果

设置高度为 30 后,宽度也跟随进行了改变

image.png


width

同 height


size

  1. 代码
    item1(m = Modifier.background(color = Color.Blue).size(30.dp))
  2. 效果图

宽高都变为了 30dp

image.png


background

简单使用 background 设置背景色

item1(m = Modifier.background(color = Color.Red))


实现圆形背景

  1. 代码
item1(m = Modifier.background(color = Color.Red,shape = CircleShape))
复制代码
  1. 效果

image.png


实现圆角背景

  1. 代码
item1(m = Modifier.background(color = Color.Red,shape = RoundedCornerShape(10.dp)))
复制代码

2.效果

image.png


实现渐变效果

  1. 代码
item1(m = Modifier.background(brush = Brush.linearGradient(mutableListOf(Color.Red,Color.Green,Color.Yellow,Color.Gray))))
复制代码
  1. 效果

image.png

默认的线性渐变效果是从左上到右下的


verticalScroll

加上它 Column 就可以垂直方向进行滚动了

  1. 代码
Column(
        modifier = Modifier
            .verticalScroll(rememberScrollState())
            .fillMaxSize(1f)
    )
复制代码


padding、border

  1. 代码
item1(
            m = Modifier
                .background(color = Color.Red,shape = CircleShape)
                .padding(4.dp)
                .border(border = BorderStroke(2.dp, color = Color.Green),shape = CircleShape)
        )
复制代码


  1. 效果
    本例实现了这样一个效果,先添加圆形背景,再添加 padding,最后添加圆形 border

image.png


clip

注意 background 方法和 clip 方法不能同时使用,否则 background 会覆盖 clip 的效果

  1. 代码
Box(modifier = Modifier.clip(CircleShape)) {
            Box(Modifier.size(200.dp).background(color = Color.Green))
        }
复制代码
  1. 效果

image.png


clipToBounds

暂无


offset

根据文档中的描述,offset 可以对控件内部元素的内容进行偏移,比如:

如果内部元素是 LTR,则 x 正值向右,负值向左

如果内部元素是 RTL,则 x 正值向左,负值向右

  1. 代码
item1(m = Modifier.background(color = Color.Red).offset(x=30.dp))
复制代码
  1. 效果

image.png

absoluteOffset

与 offset 类似,不过不会考虑布局方向。

正值向右或下,负值向左或上


absolutePadding

暂无


alpha

设置透明度

  1. 代码
item1(m = Modifier.background(color = Color.Red).alpha(0.3f))
复制代码
  1. 效果

image.png


clickable

让任意控件变的可点击,并且会附加水波纹效果

  1. 代码
    item1(m = Modifier.background(color = Color.Red).clickable(onClick = { Log.e("tag","安安安安卓") }))
  2. 效果
    打印日志
E/tag: 安安安安卓
E/tag: 安安安安卓
E/tag: 安安安安卓
E/tag: 安安安安卓
复制代码


defaultMinSize

可以设置控件的最小尺寸

  1. 代码
item1(m = Modifier.background(color = Color.Red).defaultMinSize(300.dp))
复制代码
  1. 效果

image.png

item1 中控件的宽度是 100dp,我们将最小控件尺寸设置为 300dp,然后控件宽度自动的变为了 300dp,说明最小尺寸生效了。


draggable

暂无


drawBehind

暂无


drawWithCache

暂无


drawWithContent

暂无


heightIn

设置最小高度


horizontalScroll

使我们的空间可以水平滑动,我们代码中用的 Text 做 demo,结果 Text 变成了单行可滑动

  1. 代码
Text(
            text = "公众号,安安安安卓,是一个用来分享安卓知识的公众号,ad发法撒扥a懂法A栋发扥as扥",
            modifier = Modifier
                .horizontalScroll(enabled = true, state = ScrollState(12))
                .height(100.dp)
                .background(color = Color.Green),
            textAlign = TextAlign.Center
        )
复制代码
  1. 效果

image.png


indication

暂无


layout

暂无


layoutId

给控件设置 id

使用ConstraintLayout的时候会有用

  1. 代码
item1(m = Modifier.background(color = Color.Red).layoutId("name"))
复制代码


nestedScroll

暂无


onFocusChanged

暂无


onFocusEvent

暂无


onGlobalPositioned

暂无


onKeyEvent

暂无


onPreviewKeyEvent

暂无


onSizeChanged

暂无


paddingFrom

暂无


PaddingFromBaseLine

暂无


paint

暂无


pointInput

暂无


requireHeight

  1. 代码
  2. 效果


requireHeightIn

重新设置最小高度,

  1. 代码
item1(m = Modifier.background(color = Color.Red).requiredHeight(height = 20.dp))
复制代码
  1. 效果

image.png


蓝框中的高度是调用了 requireHeightIn 方法的效果

框外的是正常的控件高度


requireSize

同:requireHeightIn


requireWidth

同:requireHeightIn


requireWidthIn

同:requireHeightIn


scale

对控件里面的内容进行缩放

  1. 代码
item1(m = Modifier.background(color = Color.Red).scale(2f))
复制代码
  1. 效果

image.png


shadow

阴影效果

  1. 代码
item1(
            m = Modifier
                .background(color = Color.Red)
                .shadow(elevation = 3.dp, shape = RectangleShape,clip = true)//不知道是否是我用的不对,效果非常不好看
        )
复制代码
  1. 效果

image.png

感觉效果好丑,肯定是我用错了


sizeIn

最小尺寸


swipeable

暂无


toggleable

非常适合用来做开关效果,本例我们用自己找到的两张图模拟点击切换状态

  1. 代码
val selected = remember {
        mutableStateOf(true)
    }
    Image(
        painter = painterResource(id = if (selected.value) R.drawable.apple else R.drawable.luobinsmile),
        contentDescription = null,
        modifier = Modifier
            .toggleable(
                value = selected.value,
                enabled = true,
                role = null,
                onValueChange = {
                    selected.value = it
                })
            .size(100.dp)
    )
复制代码
  1. 效果

image.png


transformable

暂无


withIn

可以设置最小尺寸和最大尺寸

  1. 代码

item1(m = Modifier.background(color = Color.Red).widthIn(min = 50.dp,max = 200.dp))


wrapContentHeight

暂无


wrapContentWidth

暂无


wrapContentSize

暂无


zIndex

zIndex 用来设置控件的层级,zIndex 值较大的会覆盖在 zIndex 值较小的控件上方。如果两个控件 zIndex 一样大,那么会按照他们的代码中的顺序摆放

  1. 代码
    本例代码,我们创建了两个 Text,

第一个红色 zIndex=5

第二个绿色 zIndex=4

按我们的预期红色的会处于绿色的控件的顶部

Box {
            Text(
                text = "安安安安卓2",
                modifier = Modifier
                    .size(100.dp)
                    .background(color = Color.Red)
                    .zIndex(5f)
            )
            Text(
                text = "安安安安卓1",
                modifier = Modifier
                    .size(150.dp)
                    .background(color = Color.Green)
                    .zIndex(4f)
            )
        }
复制代码
  1. 效果

image.png

最终效果与我们预期的一致

相关文章
|
7月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
5月前
|
XML Android开发 数据格式
Android实战经验之Kotlin中快速实现动态更改应用图标和名称
本文介绍在Android中通过设置多个活动别名动态更改应用图标和名称的方法,涉及XML配置及Kotlin代码示例。
178 10
|
Swift 数据安全/隐私保护
SwiftUI 中自定义 modifier
在 Swift UI 中,自定义 Modifier 是一种强大的方式,可以让你轻松地封装和重用视图的样式和行为。在本文中,我们将探讨如何使用自定义 Modifier ,以便在应用程序中保持一致的外观和风格。
|
iOS开发
iOS开发 - 滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
iOS开发 - 滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
240 0
iOS开发 - 滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
|
存储 安全 Swift
iOS - 巧用字面量语法
iOS - 巧用字面量语法
106 0
|
iOS开发
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
98 0
|
Shell Docker 容器
dockerfile语法小解说(二)
dockerfile语法小解说
103 0
|
XML 算法 Android开发
Compose 中嵌套原生 View 原理
Compose 中嵌套原生 View 原理
281 0
Compose 中嵌套原生 View 原理
|
程序员 API iOS开发
iOS开发:个人对于textView基础用法的总结(其一)
从事了这么久ios开发,对于textView的使用并不陌生,它和textfield有相似的地方,也有不同的地方,这里只对textView的一些基础用法进行描述,textfield不在这里描述。
346 0
html+css实战57-文本修饰符
html+css实战57-文本修饰符
153 0
html+css实战57-文本修饰符