前言
流式布局广泛运用于APP中,例如APP中搜索内容的历史记录,之前我已经用Java实现过这个布局了,如今用kotlin再来试试,来看看还有什么坑
一、使用原因
1.流式布局中放了许多小的view,要求我们把这些子view妥善的摆放在一个viewgroup中,如果我们在xmL中去实现这个效果,这就要求我们去对每个子view设置margin,padding,还有位置属性。这可能需要花很多时间去摆放,去设置。
2.如果我们做一个搜索内容的历史记录,那么我们事先是不知道子view的条目和具体内容的,所以我们也没法在XML中去书写,那么我们就需要一个viewgroup去对数据进行操作,取自动生成子view,并把他们的位置摆放妥当。
二、使用步骤
1.创建一个类继承viewgroup
代码如下:
class TagLayout(context: Context?, attrs: AttributeSet?) : ViewGroup(context, attrs)
2.重写onMeasure方法
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
//摆放时所有子view占据的横向边界
var widthUsed = 0
//所有子view占据的纵向高度
var heightUsed = 0
//当前行的子view占据的宽度
var lineWidthUsed = 0
//当前行占据的纵向高度
var lineMaxHeight = 0
//拿到布局的期望宽度
val widthMeasureSpecSize = MeasureSpec.getSize(widthMeasureSpec)
for ((index, child) in children.withIndex()) {
//给child进行测量
measureChildWithMargins(
child,
widthMeasureSpec,
0,
heightMeasureSpec,
heightUsed
)
//超出边界时换行
if (child.measuredWidth + lineWidthUsed > widthMeasureSpecSize) {
//累加这行的高度
heightUsed += lineMaxHeight
//新开一行,还没有子view,下面两个值置为零
lineWidthUsed = 0
lineMaxHeight = 0
//由于新开了一行,则对子view进行重新测量
measureChildWithMargins(
child,
widthMeas

本文介绍了如何使用Kotlin实现自定义流式布局,适用于动态生成和摆放子view的情况,如搜索历史记录展示。文章详细阐述了创建自定义ViewGroup、重写onMeasure和onLayout方法的步骤,特别强调了在onMeasure中正确设置widthUsed的重要性,以避免子view意外换行。
最低0.47元/天 解锁文章
695

被折叠的 条评论
为什么被折叠?



