Android进阶 - 自定义ViewGroup - FlowLayout流式布局实现( java / kotlin )

Android进阶 - 自定义ViewGroup - FlowLayout流式布局实现java / kotlin版本

什么是流式布局

思路

  • 第一步:在onMeasure()中,需要测量每一个子View的宽和高,并用View保存起来
  • 第二步:用一个变量记录每个view的宽和高,并且记录下来
  • 第三步:如果每次记录的宽 + 当前的宽 = ViewGroup的宽说明需要换行
  • 第四步:当换行的时候,累加当前行view中最高的height,记录下来即可
  • 第五步:最终ViewGroup的宽为记录的View每一行宽最大的值,高为累加的高
  • 第六步:以行为单位记录每一个View
  • 第七步:切记需要处理最后一行,因为这里判断的是换行才记录,很多情况是不满足换行要求的.此时onMeasure()方法代码完毕
  • 第八步:在onLayout()中循环得到记录的每一行的View,然后循环给View设置宽高

ViewGroup中Margin获取不到

java解决:

重写这三个方法:

	/**
     * 子控件获取marge方法   start
     */
    @Override
    protected LayoutParams generateDefaultLayoutParams() {
        return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }

    @Override
    protected LayoutParams generateLayoutParams(LayoutParams p) {
        return new MarginLayoutParams(p);
    }

    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new MarginLayoutParams(getContext(), attrs);
    }
    // 子控件获取marge方法   stop

直接强转会类型不匹配

MarginLayoutParams layoutParams = (MarginLayoutParams) childAtView.getLayoutParams();

layoutParams.leftMargin     //左侧margin
layoutParams.rightMargin	//右侧margin
layoutParams.topMargin		//上测margin
layoutParams.bottomMargin	//下测margin

kotlin解决:

override fun generateLayoutParams(p: LayoutParams?): LayoutParams? {
        return MarginLayoutParams(p)
    }

    override fun generateLayoutParams(attrs: AttributeSet?): LayoutParams? {
        return MarginLayoutParams(context, attrs)
    }

    override fun generateDefaultLayoutParams(): LayoutParams? {
        return MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
    }
val layoutParams = childView.layoutParams as MarginLayoutParams

效果图:



kotlin完整代码

java完整代码

完整项目

博主主页

原创不易,您的点赞就是对我最大的支持~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s10g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值