android系統(tǒng)控件是不支持流式布局(類似熱門標(biāo)簽的),但網(wǎng)上有蠻多成熟的自定義控件,寫得比較好的有flowlayout,對Flowlayout源碼的解析:鏈接 然而Flowlayout只是實現(xiàn)了簡單布局排列功能,當(dāng)產(chǎn)品設(shè)計提出其他擴(kuò)展要求的時候就需要自己對flowlayout進(jìn)行改造的。本文主要講兩個因項目中的小擴(kuò)展。
自定義換行
閱讀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的總高度/每行的高度,得到一共有多少行。然后進(jìn)行展開折疊操作
- 兩種方式獲取flowlayout handler延時獲取
- ddOnGlobalLayoutListener方式獲取
產(chǎn)生的問題:handler有明顯的延時,在界面上的表現(xiàn)形式就是等一會才會折疊起來。而ddOnGlobalLayoutListener的執(zhí)行時機(jī)無法準(zhǔn)確確定。
2.最終的實現(xiàn)方案還是在onMeasure方法里做文章
- 添加最后一個view時候判斷高度是否超過兩行,超過了就強(qiáng)制height = lineheight * 2
- 至于界面上的展開折疊箭頭展示,用一個接口來通知更新的。
- flowLayout.requestLayout()來重新刷新界面
擴(kuò)展
展開折疊功時候加上動畫效果