普通View的measure流程

2022-02-02 09:27:25 字數 2154 閱讀 3473

對於普通的view,其測量在viewgroup中的measurechildwithmargins函式中呼叫child view的measure開始測量。

1:從measure函式開始

1

public

final

void measure(int widthmeasurespec, int

heightmeasurespec)

1213

//measure ourselves, this should set the measured dimension flag back

14onmeasure(widthmeasurespec, heightmeasurespec);

1516

//flag not set, setmeasureddimension() was not invoked, we raise

17//

an exception to warn the developer

18if ((mprivateflags & measured_dimension_set) !=measured_dimension_set)

2324 mprivateflags |=layout_required;25}

2627 moldwidthmeasurespec =widthmeasurespec;

28 moldheightmeasurespec =heightmeasurespec;

29 }

官方關於此函式的說明:measure函式用來計算乙個view的尺寸,其傳入的引數為parentview對此view的寬/高限制資訊。實際的尺寸測量將會呼叫onmeasure來完成,因此,子類必須重寫onmeasure函式。

通過measure函式的原始碼我們也可以知道:首先,它是final的,所以不可以重寫;其次,它主要是對傳入的parentview的寬高限制資訊進行了是否與上一次的相同的判斷,若是相同則不呼叫onmeasure重新測量;

2:measure ——> onmeasure函式

1

protected

void onmeasure(int widthmeasurespec, int

heightmeasurespec)

通過其**,我們可以知道主要用了這三個函式,我們一一分析:

2.1:getsuggestedminimumwidth函式:返回android:minwidth和背景寬度二者之間的最大值

1

protected

intgetsuggestedminimumwidth() 9}

1011

return

suggestedminwidth;

12 }

2.2:getdefaultsize:如果measurespec沒有限定則返回size,否則返回measurespec中的size

1

public

static

int getdefaultsize(int size, int

measurespec)

15return

result;

16 }

到此:我們可以總結getdefaultsize(getsuggestedminimumwidth(), widthmeasurespec)的邏輯:如果parentview對尺寸沒有限制(即parentview的模式為unspecified),那麼將返回view的suggested最小值,否則返回parentview指定的尺寸。getdefaultsize(getsuggestedminimumheight(), heightmeasurespec)類似。

2.3 setmeasureddimension:很簡單,設定測量的寬高(注意不是view實際的寬高,實際的寬高要等layout完成之後才確定,雖然幾乎全部就是measure後的寬高)

1

protected

final

void setmeasureddimension(int measuredwidth, int

measuredheight)

至此,關於onmeasure函式分析結束。

View框架之measure 流程

注意 1.以下measurespec用ms來代替 ms具體會在後面介紹 2.該時序圖描述的是從viewrootimpl開始的measure 過程,因為viewrootimpl是window與view連線的樞紐 3.該時序圖著重於大概流程及重要方法的作用,具體 細節會放到後面介紹 4.decorvie...

View工作原理 Measure過程

知識點 view的measure過程和activity的生命週期不同步 一 view的measure過程 measure是final,不可重寫 measure onmeasure setmeasureddimension getdefaultsize這裡atmost和exactly進行了相同的操作 ...

普通文件流,定位(絕對,相對,固定),浮動

開篇介紹 在css中是有三種定位機制的 普通文件流 浮動和絕對定位。在未指定其它兩種定位機制的情況下,所有框都是在普通文件流中定位的。1 普通文件流 即就是根據塊級元素的標籤在html裡的順序,從上至下,依次排開。行內元素在一行中水平排列的。行元素 行內元素 在水平方向上修改水品尺寸 padding...