自定義Android流布局實現推薦標籤功能

2021-06-24 11:29:57 字數 2703 閱讀 2386

之前遇到需要用自動換行的流布局來實現推薦標籤的功能,當時為這個問題弄得焦頭爛額,找了好多**都沒能完美解決這個問題,不過最終還是搞定了。

我想要實現的就是這種效果,最開始是用的linearlayout布局,但發現當標籤過多時沒辦法自動換行,沒辦法只能自定義控制項來實現了。

下面直接上**

public class flowlayout extends viewgroup 

public flowlayout(context context, attributeset attrs)

public flowlayout(context context)

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec) else

// 未換行

// 最後乙個控制項

if (i == ccount - 1)

} log.e("tag", "sizewidth = " + sizewidth);

log.e("tag", "sizeheight = " + sizeheight);

setmeasureddimension(

//modewidth == measurespec.exactly ? sizewidth : width

+ getpaddingleft() + getpaddingright(),

modeheight == measurespec.exactly ? sizeheight : height

+ getpaddingtop() + getpaddingbottom()//

);} /**

* 儲存所有的view

*/private list> mallviews = new arraylist>();

/*** 每一行的高度

*/private listmlineheight = new arraylist();

@override

protected void onlayout(boolean changed, int l, int t, int r, int b)

linewidth += childwidth + lp.leftmargin + lp.rightmargin;

lineheight = math.max(lineheight, childheight + lp.topmargin

+ lp.bottommargin);

lineviews.add(child);

}// for end

// 處理最後一行

mlineheight.add(lineheight);

mallviews.add(lineviews);

// 設定子view的位置

int left = getpaddingleft();

int top = getpaddingtop();

// 行數

int linenum = mallviews.size();

for (int i = 0; i < linenum; i++)

marginlayoutparams lp = (marginlayoutparams) child

.getlayoutparams();

int lc = left + lp.leftmargin;

int tc = top + lp.topmargin;

int rc = lc + child.getmeasuredwidth();

int bc = tc + child.getmeasuredheight();

// 為子view進行布局

child.layout(lc, tc, rc, bc);

left += child.getmeasuredwidth() + lp.leftmargin

+ lp.rightmargin;

}left = getpaddingleft();

top += lineheight;

} }/**

* 與當前viewgroup對應的layoutparams

*/@override

public layoutparams generatelayoutparams(attributeset attrs)

}

在我們的專案中使用的時候自然要動態的來新增標籤

private flowlayout type;

type = (flowlayout) findviewbyid(r.id.type);

initdata(basedata.types, type);

private void initdata(string data, flowlayout layout) 

}

下面是tv.xml

<?xml version="1.0" encoding="utf-8"?>

這樣就完美實現了乙個自動換行的流布局。

瀑布流布局與自定義瀑布流布局外掛程式

瀑布流布局是網頁中經常採用的一種布局方式,其布局有如下特點 瀑布流布局特點 1 元素按列排放 2 列寬一致,但高度不等 3 布局過程中將優先向高度最小的列補充資料 以下是自定義的乙個jquery瀑布流外掛程式 jquery.mywaterfull.js function arrheight.push...

Android 自定義組合布局

package com.itheima.mobilesafe66.view import android.content.context import android.util.attributeset import android.view.view import android.widget.r...

自定義Toast實現自定義Toast布局

平時我們使用toast的時候都是這樣的一種方法 toast toast toast.maketext context,duration 現在我們來自定義下toast的布局,首先看下toast建立時的源 public static toast maketext context context,char...