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

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

相关文章
|
Android开发
android Compose中沉浸式设计、导航栏、状态栏的处理
android Compose中沉浸式设计、导航栏、状态栏的处理
2821 0
android Compose中沉浸式设计、导航栏、状态栏的处理
Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用
Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用
1887 0
Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
527 5
|
12月前
|
移动开发 JavaScript 前端开发
HarmonyOS鸿蒙应用开发——探索原生与H5通信框架DSBridge
HarmonyOS版DSBridge是一个桥梁库,允许鸿蒙原生环境与JavaScript交互。它兼容Android和iOS的第三方DSBridge核心功能,支持同步和异步调用、命名空间API管理、进度回调及页面关闭监听等功能。主要特性包括适配鸿蒙NEXT版本、支持串行异步并发任务、兼容DSBridge 2.0与3.0版本JS脚本,并提供类形式集中管理API及自定义页面组件注册。源码仓库:HarmonyOS版 - DSBridge-HarmonyOS。安装命令为`ohpm install @hzw/ohos-dsbridge`。通过该库,开发者可以方便地在鸿蒙系统中实现原生与JS的高效交互。
785 1
|
API Android开发 开发者
NavigableListDetailPaneScaffold
【9月更文挑战第12天】
181 5
|
前端开发 Android开发 Windows
27. 【Android教程】下拉选择框 Spinner
27. 【Android教程】下拉选择框 Spinner
736 2
|
设计模式 安全 数据库连接
|
API Android开发 开发者
Android经典实战之用WindowInsetsControllerCompat方便的显示和隐藏状态栏和导航栏
本文介绍 `WindowInsetsControllerCompat` 类,它是 Android 提供的一种现代化工具,用于处理窗口插入如状态栏和导航栏的显示与隐藏。此类位于 `androidx.core.view` 包中,增强了跨不同 Android 版本的兼容性。主要功能包括控制状态栏与导航栏的显示、设置系统窗口行为及调整样式。通过 Kotlin 代码示例展示了如何初始化并使用此类,以及如何设置系统栏的颜色样式。
843 2
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
|
安全 网络安全 API
kotlin安卓开发JetPack Compose 如何使用webview 打开网页时给webview注入cookie
在Jetpack Compose中使用WebView需借助AndroidView。要注入Cookie,首先在`build.gradle`添加WebView依赖,如`androidx.webkit:webkit:1.4.0`。接着创建自定义`ComposableWebView`,通过`CookieManager`设置接受第三方Cookie并注入Cookie字符串。最后在Compose界面使用这个自定义组件加载URL。注意Android 9及以上版本可能需要在网络安全配置中允许第三方Cookie。