这篇文章我们会讲解下,Compose中如何去自定义布局,以及Intrinsic Measurement(官方翻译为固有特性测量)的理解跟使用。
一:自定义布局
自定义布局可以通过两种方式去处理,一种是使用布局修饰符Modifier.layout,一种是使用Layout去创建自定义布局。我们先来讲下Modifier.layout的方式
1.1 使用布局修饰符来实现自定义布局
我们自定义一个Modifier的扩展函数,Modifier.customCornerPosLayout。该方法的作用就是可以按我们传入的CornerPosition,去把view放置在左上角,左下角,右上角,右下角。代码如下:
enum class CornerPosition{
TopLeft,
TopRight,
BottomLeft,
BottomRight
}
fun Modifier.customCornerPosLayout(pos:CornerPosition) = layout { measurable, constraints ->
// Measure the composable
val placeable = measurable.measure(constraints)
layout(constraints.maxWidth, constraints.maxHeight) {
// Where the composable gets placed
when(pos){
CornerPosition.TopLeft->{
placeable.placeRelative(0, 0)
}
CornerPosition.TopRight->{
placeable.placeRelative(constraints.maxWidth-placeable.width, 0)
}
CornerPosition.BottomLeft->{
placeable.placeRelative(0, constraints.maxHeight-placeable.height)
}
CornerPosition.BottomRight->{
placeable.placeRelative(constraints.maxWidth-placeable.width, constraints.maxHeight-placeable.height)
}
}
}
}
复制代码
- 首先我们声明一个枚举。叫CornerPosition,枚举有四种取值,TopLeft表示左上角,TopRight右上角,BottomLeft左下角,BottomRight又下角。
- 接着我们定义一个Modifier的扩展函数customCornerPosLayout,入参是pos:CornerPosition我们的枚举类
- customCornerPosLayout的实现是通过layout的lamda去实现。其实是调用Modifier.layout去实现自定义布局。有两个参数一个是measurable,一个是constraints父控件的约束
- 自定义布局第一步val placeable = measurable.measure(constraints) 是根据measurable跟constraints父控件的约束,通过方法measurable.measure(constraints)去生成一个placeable类。该类拥有子控件的宽width跟高height
- 自定义布局的第二部 需要调用layout(w,h)的方法去设置当前view能使用的宽高。我们这里是用layout(constraints.maxWidth, constraints.maxHeight) 传入的是constraints.max