需求
产品要求做一个控件,当元素个数超过4个的时候自动换行。然后界面中每个元素都是高度居中的,每个元素有固定的间距。
FLOWLAYOUT
参考了
http://blog.csdn.net/lmj623565791/article/details/38352503/
本文也是基于着部分代码进行了定制。
固定元素个数换行
if ((lineUsed + spaceWidth > widthSize) || (lineCount > nums))
在onMeasure和onLayout换行判断的时候,计算当前行的元素个数,当当前行的元素个数大于设定值的时候同lineUsed + spaceWidth > widthSize,元素位置不足时换行的逻辑。
单个元素高度居中
每行的元素高度可能各不相同,原先的代码中通过
if (spaceHeight > lineHeight) {
lineHeight = spaceHeight;
}
计算每行元素的最大高度,目前采用的方案是在onMeasure时记录每行的最大高度。
lineHeightList.add(lineHeight);
在onLayout计算高度偏移位置,放置对应的元素,具体的代码如下:
int gap = 0;
if (null != lineHeightList.get(lineCount)) {
int lineMaxHeight = lineHeightList.get(lineCount);
if (CENTER == gravity)
gap = (lineMaxHeight - bottom + top + 1) / 2;
if (BOTTOM == gravity)
gap = lineMaxHeight - bottom + top;
}
if (gap < 0)
gap = 0;
child.layout(left, top + gap, right, bottom + gap);