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

818 阅读1分钟

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完整代码

完整项目

博主主页

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