基于FLOWLAYOUT的改造,支持每行最大个数和每行元素高度居中。

需求

产品要求做一个控件,当元素个数超过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);

你可能感兴趣的:(ANDROID控件的坑)