基於FLOWLAYOUT的改造,支援每行最大個數和每行元素高度居中。
阿新 • • 發佈:2019-02-17
需求
產品要求做一個控制元件,當元素個數超過4個的時候自動換行。然後介面中每個元素都是高度居中的,每個元素有固定的間距。
FLOWLAYOUT
固定元素個數換行
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);