Measure 0,0 到底發生了什麼

2021-07-04 20:25:06 字數 1754 閱讀 7988

最開始接觸這個方法的時候是在寫自定義控制項的時候,比如,父控制項的高度需要根據子控制項來動態改變,那麼我們就需要手動的去測量每乙個子控制項,然後他們的總高度就是父類最終的高度了。

在大多數情況下,這個邏輯可能是能夠走通的,但是,我會舉個栗子來讓這個邏輯走不通。

1. 如果我對乙個原生的view使用measure(0,0),是毫無意義的。

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec)

如果大家點進getdefaultsize這個方法中仔細看的話,其結果還會是0,所以,你還是得不到其measuredwidth和measuredheight。

但是,如果你對乙個imageview使用了該方法(前提是已經設定了給他),是有效果的。我通過斷點的形式得到如下結果。

一起來看一看imageview的onmeasure()方法吧。真正其變化的在這兩行

w = math.max(w, getsuggestedminimumwidth());

h = math.max(h, getsuggestedminimumheight());

所以真正使資料發生改變的就是這個getsuggestedminimumwidth方法,點進去後看就會發現,你給imageview設定了background,那麼他就會以這個背景來作為最小建議值,如果是原生的view的話,就是0.

後面的resolvesizeandstate方法是為了做更進一步的校正,即有可能的寬度比裝置還大。等等。

2. 如果你給這個view設定了param,你還是測量不出,但是介面的顯示會達到你預期的效果。

假設現在我們給這個view設定了param,即高度是200,寬度是-1(match_parent)。

如果此時我們去呼叫measure(0,0),仍然無法達到我們所要的效果,即得不到measuredwidth和measuredheight,那麼我們究竟應該怎麼做呢,其實思路很簡單。首先呢,measure()方法需要的是

widthmeasurespec和heightmeasurespec,如果我們還是給(0,0),說明我們隊測量的過程是放任不管的

因為0代表public static final int unspecified = 0。但是如果我們現在給他設定了param,說明我們現在是想管的,那既然想管,就得重新給他measurespec,所以,我們自己make乙個給他就行了。

注:match_parent=-1 wrap_content=-2;

private void measureview(view child) 

int lpheight = p.height

; int lpwidth = p.width

; int childheightspec;

int childwidthspec;

if (lpheight > 0) else

if (lpwidth > 0) else

child.measure(childwidthspec, childheightspec);

}

如果我們使用上面的**進行測量,param為(-1,200),那麼我們得出的width=0,height=200.

Js new到底發生了什麼

在js中,我們使用了new關鍵字來進行例項化 那麼在這個new的過程中到底發生了什麼?關於建構函式的return 正常來講建構函式中是不用寫return語句的,因為它會預設返回新建立的物件。但是,如果在建構函式中寫了return語句,如果return的是乙個物件,那麼函式就會覆蓋掉新建立的物件,而返...

Golang append原理以及發生了什麼

type slice strucefunc slice type,elems type 值為結構體的情況下考慮使用指標。返回乙個新的切片先根據傳參觀察是否需要擴容 如果要擴容,擴容本質是分配一塊更大的記憶體,並將舊slice的資料拷貝進新的slice。若原slice容量小於1024就會將容量擴大為原...

C 引數傳遞時到底發生了什麼

1 引用型別的變數只包含物件所在的記憶體位址,將要複製的是記憶體位址而不是物件本身,所以對底層物件的修改會保留。unsafeclassprogram fixed int pid mye.id 值為 uint pid uint pid testmethod mye fixed int pid mye....