FlowLayout流式布局(類似熱門標(biāo)簽)改造

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ò)展

展開折疊功時候加上動畫效果

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容