四 View 的測量寬高和最終寬高的區別

2021-08-17 16:43:33 字數 1615 閱讀 9749

這個問題可以具體為getmeasuredheight()getheight()有什麼區別。

view

public

final

intgetheight()

再看看 mbottom 、mtop 是怎麼來的:

view

protected

boolean

setframe(int left, int top, int right, int bottom)

接著看 setframe 在哪呼叫的:

view

public

void

layout(int l, int t, int r, int b)

接著看 layout 在哪呼叫的,首先肯定是父容器確定子元素位置的時候呼叫的該方法,由於 layout 是view確定自身的位置,onlayout 是確定子元素的位置,因此應該在父容器的 onlayout 中呼叫的子元素的 layout,拿 linearlayout 舉例來說:

linearlayout

protected

void

onlayout(boolean changed, int l, int t, int r, int b) else

}

接著看layoutvertical(l, t, r, b),水平方向和豎直方向的類似。

linearlayout

void layoutvertical(int left, int top, int right, int bottom)
接著看setchildframe

linearlayout

private

void

setchildframe(view child, int left, int top, int width, int height)

public

void

layout(int l, int t, int r, int b)

如果按照上面這樣重寫,那麼getheight()得到的值會比getmeasuredheight()大100。

注意:在某些情況下,view 需要多次 measure 才能確定自己的測量寬高,再前幾次的測量過程中,得出的測量寬高有可能和最終寬高不一致,但是到了最後,測量寬高和最終寬高還是相同的,除非有意重寫 layout() 修改。

注意

雖說在 layout 階段確定 view 的最終寬高,但是在 onlayout 中呼叫子 view 的getwidth()經常取不到寬高值,除非子 view 的位置已經確定

獲取view寬高

在oncreate 中利用view.getwidth 或是view.getheiht 來獲取view的寬和高,看似沒有問題,其實他們去得值是0,並不是你想要的結果?這是為什麼呢?在呼叫oncreate 方法時,介面處於不可見狀態,記憶體載入元件還沒有繪製出來,你是無法獲取他的尺寸。那如何在繪製元件之...

android測量文字的寬高

獲取文字高度 1.基準線是baseline 2.ascent 字型在baseline上方被推薦的距離 一些字型製作商需要參考這個 3.descent 字型在是baseline下方被推薦的距離 一些字型製作商需要參考這個 4.top ascent的最大值 5.bottom descent的最大值 四個...

css已知寬高和未知寬高的居中定位

1 已知寬高 上圖中我們想要對已知寬度的 服務範圍 進行左右居中定位,我們可以先選擇left或者right樣式,這裡我們選擇的是left,這裡的50 指的是這個盒子的最左側位於水平的百分之五十的地方,也就是中間位置,因為我們知道整體的寬度,所以我們可以直接採用在向左移動寬度的一半,也就是margin...