自定义流式布局--kotlin实现

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


前言

流式布局广泛运用于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值