android系統(tǒng)控件是不支持流式布局(類似熱門標(biāo)簽的)攒暇,但網(wǎng)上有蠻多成熟的自定義控件骑祟,寫得比較好的有flowlayout,對Flowlayout源碼的解析:鏈接 然而Flowlayout只是實現(xiàn)了簡單布局排列功能,當(dāng)產(chǎn)品設(shè)計提出其他擴展要求的時候就需要自己對flowlayout進行改造的玛瘸。本文主要講兩個因項目中的小擴展栓霜。
自定義換行
閱讀Flowlayout源碼不難發(fā)現(xiàn)以下代碼翠桦。是計算子view的寬度是否能在當(dāng)前行放下如果放不下就新起一行,所以只要在這個判斷中傳入一個boolean變量控制新增一行即可胳蛮。需要提醒的是onMeasure方法和onLayout方法中都需要做此操作
if (lineWidth + childWidth > sizeWidth) {
width = Math.max(width, lineWidth);
lineWidth = childWidth;
height += lineHeight;
lineHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
if (height / lineHeight == 2) {
callBack.isShowIcon(true);
index = i;
}
} else {
lineWidth += childWidth;
lineHeight = Math.max(lineHeight, child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
}
folwlayout實現(xiàn)折疊展開功能
1.嘗試的思路先獲取到flowlayout的總高度/每行的高度销凑,得到一共有多少行。然后進行展開折疊操作
- 兩種方式獲取flowlayout handler延時獲取
- ddOnGlobalLayoutListener方式獲取
產(chǎn)生的問題:handler有明顯的延時仅炊,在界面上的表現(xiàn)形式就是等一會才會折疊起來斗幼。而ddOnGlobalLayoutListener的執(zhí)行時機無法準(zhǔn)確確定。
2.最終的實現(xiàn)方案還是在onMeasure方法里做文章
- 添加最后一個view時候判斷高度是否超過兩行抚垄,超過了就強制height = lineheight * 2
- 至于界面上的展開折疊箭頭展示蜕窿,用一個接口來通知更新的谋逻。
- flowLayout.requestLayout()來重新刷新界面
擴展
展開折疊功時候加上動畫效果