自定義乙個TagLayout

2021-08-11 13:27:26 字數 3145 閱讀 5111

自定義乙個標籤自動排版顯示的布局。效果:

思路  一、:確定布局的寬,高。

寬度確定:所有行中,寬度最寬的行即為這個布局的寬。

高度確定 :所有行的高度加起來  即 為這個布局的高度。

二、擺放子view思路

如果能夠確定每乙個child的 right 和 bottom ,或者 left,top,那麼就可以遍歷每乙個child, 直接擺放即可。

那麼就圍繞這個思路 來計算每乙個child的right和bottom.

這裡我用arraylist資料格式 來儲存每乙個child的right和bottom。int 陣列裡面存放著right ([o])和bottom( [1] ).

三、確定換行時機 和 每乙個child的right和bottom 。

遍歷每乙個child,獲取child的measurewidth 和marginleft marginright,並且累加求和,注意,這裡的累加求和就是每乙個child的right 了。

當:(templinewidth + currentchildwidth) > parentwidth  成立時 即表示該換行了。當換行時 就可以確定這一行所有child的bottom或者top了。

**:onmeasure

/**

* 父容器體提供的寬高大小規格

** @param widthmeasurespec 最大寬度(不能超過)

* @param heightmeasurespec 最大高度

*/@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

//測量viewgroup自己

//根據父容器給定的規格(widthmeasurespec,heightmeasurespec)拿到自己的規格

int widthmode = measurespec.getmode(widthmeasurespec); //mode

int heightmode = measurespec.getmode(heightmeasurespec);

int atmostwidth = measurespec.getsize(widthmeasurespec); //value

int atmostheight = measurespec.getsize(heightmeasurespec);

//根據拿到的規格計算出各種mode下的測量值。

int viewgroupmeasuredwidth = 0;

int viewgroupmeasuredheight = 0;

//每一行的高度

int lineheight = 0;

int linewidth = 0;

// 遍歷子view 同時測量viewgroup的寬高。

for (int i = 0; i < childcount; i++) else

//在最後乙個child確定 viewgroup 大小

if (i == childcount - 1)

}if (widthmode == measurespec.exactly)

if (heightmode == measurespec.exactly)

setmeasureddimension(viewgroupmeasuredwidth, viewgroupmeasuredheight);

}

擺放的 **:onlayout

/**

* //擺放 採用(left,top) 和(right,bottom)這兩個點來固定子view的位置

** @param changed

* @param l

* @param t

* @param r

* @param b

*/@override

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

wh.add(rightheight);

}lineviewright.clear();

newlinetag = 0;

templineheight = 0;

//寬templinewidth = 0;

templinewidth += currentchildwidth;

lineviewright.add(currentchildwidth);

newlinetag++;

//高templineheight = math.max(templineheight, currentchildheight);

} else

//最後一行

if (i == childcount - 1) ;

wh.add(rightheight);}}

}system.out.println("childcount:" + childcount + "--wh:" + wh.size());

if (childcount != wh.size())

int len = wh.size();

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

}

/**

* 如果自定義viewgroup 在測量時需要margin 屬性用來計算的,複寫父類此方法。

* 返回marginlayoutparams 即可。

** @param attrs

* @return

*/@override

public layoutparams generatelayoutparams(attributeset attrs)

使用:

自定義乙個死鎖

在鎖o1釋放之前需要等待鎖o2的釋放 在鎖o2釋放之前需要等待鎖o1的釋放.死在無限等待對方釋放鎖的迴圈中.這只是乙個簡單的死鎖 a需要b,b需要a 複雜一些的有 a需要b,b需要c,c需要a.public class demo6 implements runnable catch interrup...

實現乙個自定義元件

如果要建立乙個自定義元件,你需要重寫uicomponent類的某些方法,最少需要重寫如下方法 建構函式,createchildren commitproperties measure layoutchrome updatedisplaylist 基礎語句結構如下 package mycomponen...

如何自定義乙個UIProgressView

viewcontroller.m裡的檔案 import viewcontroller.h import myprogressview.h inte ce viewcontroller end implementation viewcontroller void viewdidload void di...