Android自动换行布局

本文介绍了一种自动换行布局的实现方法,通过计算布局大小和子视图位置,确保子视图不会超过父视图的最大宽度,从而实现自动换行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网上找了挺久都没找到好用的自动换行布局,于是干脆自己写一个吧,原理其实就是计算布局大小,然后摆放的时候计算子view摆放的时候是否大于父view的最大宽度,超过了就在下面一行摆放就好了,注释就不多写了
直接上代码大家拿去用吧

/**
 * 自动换行布局
 */
class AutoWrapLayout @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val width = MeasureSpec.getSize(widthMeasureSpec)
        var right: Int = 0
        var height: Int = paddingTop + paddingBottom
        var lineMaxHeight = 0
        for (i in 0 until childCount) {
            val view = getChildAt(i)
            val layoutParams = view.layoutParams as FrameLayout.LayoutParams
            val viewWidth = view.measuredWidth + layoutParams.leftMargin + layoutParams.rightMargin
            val viewHeight = view.measuredHeight + layoutParams.topMargin + layoutParams.bottomMargin
            if (right + viewWidth > width) {
                //换行
                height += lineMaxHeight
                right = 0
                lineMaxHeight = 0
            }
            if (right == 0) right = paddingLeft + paddingRight
            right += viewWidth
            if (lineMaxHeight < viewHeight) lineMaxHeight = viewHeight
            if (i == childCount - 1) height += lineMaxHeight
        }
        setMeasuredDimension(width, height)
    }

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        var childleft: Int = 0
        var childtop: Int = paddingTop
        for (i in 0 until childCount) {
            val view = getChildAt(i)
            val layoutParams = view.layoutParams as FrameLayout.LayoutParams
            val viewWidth = view.measuredWidth + layoutParams.leftMargin + layoutParams.rightMargin
            val viewHeight = view.measuredHeight + layoutParams.topMargin + layoutParams.bottomMargin
            if (childleft + viewWidth > right - paddingRight) {
                //换行
                childtop += viewHeight
                childleft = 0
            }
            if (childleft == 0) childleft += paddingLeft
            view.layout(childleft, childtop, childleft + viewWidth, childtop + viewHeight)
            childleft += viewWidth
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值