- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
原文地址: Jetpack Compose学习(14)——ConstraintLayout约束布局使用-Stars-One的杂货小窝 。
本文阅读之前,需要了解ConstraintLayout的使用.
各位可查阅我的ConstraintLayout使用一文 。
本系列以往文章请查看此分类链接Jetpack compose学习 。
implementation("androidx.constraintlayout:constraintlayout-compose:1.1.0")
可在下方链接查看官方的最新版本 。
Constraintlayout | Jetpack | Android Developers 。
在compose里的约束布局,需要先通过createRef()方法创建ref对象,之后通过Modifier.constrainAs()来进行对应的约束对齐,如下简单例子
2个组件,图片和文本,文本与图片的top和bottom对齐,位于图片的右侧,间距16dp 。
注意: createRef(),createRefs(),Modifier.constrainAs()这个ConstraintLayoutScope作用域才能使用!下面的其他的方法也是如此,之后不再赘述.
ConstraintLayout(modifier= Modifier
.fillMaxWidth()
.height(100.dp)
.background(Color.Blue)) {//这里是ConstraintLayoutScope作用域
//createRef
//val portraitImageRef = remember {
// createRef()
//}
//val userNameTextRef = remember {
// createRef()
//}
//这个可以快速创建多个引用(但一次最多只能支持16个变量!)
val (portraitImageRef,userNameTextRef) = remember{ createRefs()}
Image(painter = painterResource(id = R.drawable.ic_auto), contentDescription =null ,modifier=Modifier.size(50.dp).constrainAs(portraitImageRef){
top.linkTo(parent.top)
start.linkTo(parent.start)
bottom.linkTo(parent.bottom)
})
Text("myname",modifier=Modifier.constrainAs(userNameTextRef){
top.linkTo(portraitImageRef.top)
//还可以设置margin和goneMargin,这里我只设置了margin属性
start.linkTo(portraitImageRef.end, margin = 16.dp)
bottom.linkTo(portraitImageRef.bottom)
})
}
constrainAs的函数体中,我们还可以设置当前组件的width和height属性,具体有下面几个选项 。
Dimension Type | Description |
---|---|
wrapContent() |
实际尺寸为根据内容自适应的尺寸 |
matchParent() |
实际尺寸为铺满整父组件的尺寸 |
fillToConstraints() |
实际尺寸为根据约束信息拉伸后的尺寸 |
preferredWrapContent() |
如果剩余空间大于根据内容自适应的尺寸时,实际尺寸为自适应的尺寸。如果剩余空间小于内容自适应的尺寸时,实际尺寸则为剩余空间的尺寸。 |
ratio (String) |
根据字符串计算实际尺寸所占比率,例如 "1:2" |
percent (Float) |
根据浮点数计算实际尺寸所占比率 |
value (Dp) |
将尺寸设置为固定值 |
preferredValue (Dp) |
如果剩余空间大于固定值时,实际尺寸为固定值。如果剩余空间小于固定值时,实际尺寸则为剩余空间的尺寸。 |
一个简单示例(某个组件占满剩余宽度)
ConstraintLayout(modifier= Modifier
.fillMaxWidth()
.height(100.dp)
.background(Color.Blue)) {
val (tv1Ref,tv2Ref) = remember{ createRefs()}
Text("一个字",modifier=Modifier.constrainAs(tv1Ref){
top.linkTo(parent.top)
start.linkTo(parent.start)
})
Text("右侧文本内容",modifier=Modifier.constrainAs(tv2Ref){
start.linkTo(tv1Ref.end)
end.linkTo(parent.end)
//占满剩余空间,实际等同于普通约束布局中,给width属性设置为0dp
width = Dimension.fillToConstraints
}.background(Color.Yellow))
}
除了上面几个start.linkTo,还有基线的对齐 。
baseline.linkTo(parent.baseline)
除了上面说到的createRef方法,我们还可以通过Modifier.layoutId(id)和createRefFor(id)来联用进行创建ref对象 。
ConstraintSet对象就表明了当前的布局里的各组件的对齐关系,我们只需要构造ConstraintLayout的时候,传递此对象即可达到动态更新约束条件的效果.
下面是一个简单的示例
private fun decoupledConstraints(margin: Dp): ConstraintSet {
return ConstraintSet {
val button = createRefFor("button")
val text = createRefFor("text")
constrain(button) {
top.linkTo(parent.top, margin = margin)
}
constrain(text) {
top.linkTo(button.bottom, margin)
}
}
}
@Composable
fun SettingPage(modifier: Modifier = Modifier) {
val constraints = decoupledConstraints(margin = 32.dp)
ConstraintLayout(constraints) {
Button(
onClick = { /* Do something */ }, modifier = Modifier.layoutId("button")
) {
Text("Button")
}
Text("Text", Modifier.layoutId("text"))
}
}
平时在约束布局,不是很常用这个,一般用的GuideLine多些,不过也是记录下 。
这个需要依托存在的组件才能创建 。
ConstraintLayout{
val (tv1Ref,tv2Ref,iv1Ref) = remember{ createRefs()}
//创建位于组件右边的一个屏障
val barrier = createEndBarrier(tv1Ref,tv2Ref)
Text("一个字",modifier=Modifier.constrainAs(tv1Ref){
top.linkTo(parent.top)
start.linkTo(parent.start)
})
Text("十四个字",modifier=Modifier.constrainAs(tv2Ref){
top.linkTo(tv1Ref.bottom)
start.linkTo(tv1Ref.start)
})
//image始终位于2个文本的最右边(以最长文本为准)
Image(painter = painterResource(id = R.drawable.ic_auto), contentDescription =null,modifier=Modifier.size(50.dp).constrainAs(iv1Ref){
start.linkTo(barrier)
} )
}
createEndBarrier方法即在组件的右边位置创建屏障,除此之外还有其他3个方向的 。
createStartBarrier()
createTopBarrier
()createBottomBarrier()
引导线可以通过createGuidelineFromTop()方法直接创建,个人一般用此来进行百分比宽度等划分,然后让组件占满 。
于上面一样,还有其他方向,这里就不补充了,就是换个名字,代码提示直接可以搜到了 。
方法可接受一个0-1f范围之间的百分比或者固定的偏移量dp,如下面例子
val guide = createGuidelineFromTop(0.2f)
val guide = createGuidelineFromTop(20.dp)
一个完整使用示例
ConstraintLayout(modifier= Modifier
.fillMaxSize()
.background(Color.Blue)) {
val (tv2Ref) = remember { createRefs() }
val guide = createGuidelineFromTop(0.2f)
Text("底下占满",modifier= Modifier
.constrainAs(tv2Ref) {
top.linkTo(guide)
bottom.linkTo(parent.bottom)
width = Dimension.matchParent
height = Dimension.fillToConstraints
}
.background(Color.Yellow))
}
熟悉约束布局使用都知道这个了,有水平或垂直2种,然后ChainStyle类型有3种,这里不赘述了 。
createVerticalChain()
createHorizontalChain()
createVerticalChain(imageOneRef, imageTwoRef, chainStyle = ChainStyle.Spread)
最后此篇关于JetpackCompose学习(14)——ConstraintLayout约束布局使用的文章就讲到这里了,如果你想了解更多关于JetpackCompose学习(14)——ConstraintLayout约束布局使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我可以添加一个检查约束来确保所有值都是唯一的,但允许默认值重复吗? 最佳答案 您可以使用基于函数的索引 (FBI) 来实现此目的: create unique index idx on my_tabl
嗨,我在让我的约束在grails项目中工作时遇到了一些麻烦。我试图确保Site_ID的字段不留为空白,但仍接受空白输入。另外,我尝试设置字段显示的顺序,但即使尝试时也无法反射(reflect)在页面上
我似乎做错了,我正在尝试将一个字段修改为外键,并使用级联删除...我做错了什么? ALTER TABLE my_table ADD CONSTRAINT $4 FOREIGN KEY my_field
阅读目录 1、约束的基本概念 2、约束的案例实践 3、外键约束介绍 4、外键约束展示 5、删除
SQLite 约束 约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。 约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整
我在 SerenityOS project 中偶然发现了这段代码: template void dbgln(CheckedFormatString&& fmtstr, const Parameters
我有表 tariffs,有两列:(tariff_id, reception) 我有表 users,有两列:(user_id, reception) 我的表 users_tariffs 有两列:(use
在 Derby 服务器中,如何使用模式的系统表中的信息来创建选择语句以检索每个表的约束名称? 最佳答案 相关手册是Derby Reference Manual .有许多可用版本:10.13 是 201
我正在使用 z3py 进行编码。请参阅以下示例。 from z3 import * x = Int('x') y = Int('y') s = Solver() s.add(x+y>3) if s.c
非常快速和简单的问题。我正在运行一个脚本来导入数据并声明了一个临时表并将检查约束应用于该表。显然,如果脚本运行不止一次,我会检查临时表是否已经存在,如果存在,我会删除并重新创建临时表。这也会删除并重新
我有一个浮点变量 x在一个线性程序中,它应该是 0或两个常量之间 CONSTANT_A和 CONSTANT_B : LP.addConstraint(x == 0 OR CONSTANT_A <= x
我在使用grails的spring-data-neo4j获得唯一约束时遇到了一些麻烦。 我怀疑这是因为我没有正确连接它,但是存储库正在扫描和连接,并且CRUD正在工作,所以我不确定我做错了什么。 我正
这个问题在这里已经有了答案: Is there a constraint that restricts my generic method to numeric types? (24 个回答) 7年前
我有一个浮点变量 x在一个线性程序中,它应该是 0或两个常量之间 CONSTANT_A和 CONSTANT_B : LP.addConstraint(x == 0 OR CONSTANT_A <= x
在iOS的 ScrollView 中将图像和带有动态文本(动态高度)的标签居中的最佳方法是什么? 我必须添加哪些约束?我真的无法弄清楚它是如何工作的,也许我无法处理它,因为我是一名 Android 开
考虑以下代码: class Foo f class Bar b newtype D d = D call :: Proxy c -> (forall a . c a => a -> Bool) ->
我有一个类型类,它强加了 KnownNat约束: class KnownNat (Card a) => HasFin a where type Card a :: Nat ... 而且,我有几
我知道REST原则上与HTTP无关。 HTTP是协议,REST是用于通过Web传输hypermedia的体系结构样式。 REST可以使用诸如HTTP,FTP等的任何应用程序层协议。关于REST的讨论很
我有这样的情况,我必须在数据库中存储复杂的数据编号。类似于 21/2011,其中 21 是文件编号,但 2011 是文件年份。所以我需要一些约束来处理唯一性,因为有编号为 21/2010 和 21/2
我有一个 MySql (InnoDb) 表,表示对许多类型的对象之一所做的评论。因为我正在使用 Concrete Table Inheritance ,对于下面显示的每种类型的对象(商店、类别、项目)
我是一名优秀的程序员,十分优秀!