
回复
背景
最近项目中用到了流式布局,最初就决定自己写一个,发现一时竟然没有思路。虽然自定义控件的博客看了不少,也写过简单的自定义控件,但是真正自己独立写出一个流式布局,还是有些考验的。查找了几篇博客,思路大同小异,理清思路,自己开干写了一下。中间改了几个问题,觉得可以正常使用后,这才有了这篇博客。
我想说,会写流式布局了,表示你对ViewGroup的测量(onMeasure)和布局(onLayout)有了一个较为深入的理解。流式布局主要涉及ViewGroup对子View的测量和摆放(布局)。
效果图
参考布局
参考布局,尺寸和颜色根据自己需求修改:
MFlowLayout 代码
在 onMeasure() 中测量子View,按流式布局算出MFlowLayout自己(ViewGroup)的宽高;在 onLayout()中按流式布局准确摆放子View。见如下代码:
如果想要MFlowLayout可以设置padding,子View可以设置margin,就需要使用measureChildWithMargins(child, widthMeasureSpec, widthUsed,
heightMeasureSpec, heightUsed),这样就会在测量的时候把MFlowLayout设置的padding(wideUsed,heightUsed)和子View设置的margin计算在内。而子View可以设置margin,则需要MarginLayoutParams,具体见上面代码。