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
效果图:
原创不易,您的点赞就是对我最大的支持~