對於普通的view,其測量在viewgroup中的measurechildwithmargins函式中呼叫child view的measure開始測量。
1:從measure函式開始
1public
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函式
1protected
void onmeasure(int widthmeasurespec, int
heightmeasurespec)
通過其**,我們可以知道主要用了這三個函式,我們一一分析:
2.1:getsuggestedminimumwidth函式:返回android:minwidth和背景寬度二者之間的最大值
1protected
intgetsuggestedminimumwidth() 9}
1011
return
suggestedminwidth;
12 }
2.2:getdefaultsize:如果measurespec沒有限定則返回size,否則返回measurespec中的size
1public
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後的寬高)
1protected
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...