自定義View的總結

2021-07-11 04:55:52 字數 1297 閱讀 9386

總結來自官方文件

首先android裡邊的檢視是以樹形結構組織起來的。檢視樹的繪製是從檢視的根節點開始的。這就要求去測量和繪製這個檢視樹時遍歷檢視樹上的每乙個view。每乙個viewgroup也相當於乙個樹,他也有責任保證他的每乙個子view的draw方法會被呼叫。同樣的每乙個子view也有責任繪製自己。因為樹是按順序遍歷的,這意味著viewgroup會在子view被繪製之前已近被繪製了。(view的大小是由上一級view約束的)

繪製布局是2個過程:乙個測量過程乙個布局過程。①測量過程是在measure(int, int)中實現的,並且這是乙個自上而下的遍歷檢視樹的過程。每乙個view將尺寸資訊遞迴的傳遞下去。在遞迴結束的時候,每乙個view都設定了自己的尺寸資訊。②第二個過程是布局(對於viewgroup來說是確定子view的位置,對於自view來說就是繪製自己),呼叫layout(int, int, int, int)方法。

這也是乙個自上而下的過程。在這個過程中,父view負責使用測量過程中傳遞下的的尺寸資訊確定子view的位置。

當乙個view物件的measure()方法返回之前,他的getmeasuredwidth() and getmeasuredheight()

必須已經確定了。乙個view的寬度和高度必須受到父view的強行限制。這樣才能保證在measure()方法執行完的時候父view可以包含所有的子view。乙個父view可能對子view多次呼叫measure()方法。例如:父view可能使用unspecified mod來查探子view想要申請多大空間,如果子view的尺寸總和太大或者太小,然後會再呼叫一次measure()方法。

補充:viewgroup必須重寫他的measure(int, int)和layout(int, int, int, int)方法。這是應為viewgroup直接繼承自view,而view的measure方法是不會遍歷子view的。所以,如果不重寫measure方法,預設getmeasuredwidth()返回的0即measure方法傳入的寬高是0,所以有些view是可能看不到的。然而對於繼承自linearlayout 的view,其measure方法缺省會遍歷子view,所以不需要手動呼叫子view 的layout方法。

getwidth()和getmeasuredwidth()的區別

getwidth(): view在設定好布局後,整個view的寬度

getmeasuredwidth():對view上的內容進行測量後得到的view內容佔據的寬度。

很簡單,getwidth()就是view顯示之後的width,而getmeasuredwidth,從前面的源**就可以看出來其實是在measure裡面傳入的引數,具體是否一樣完全要看程式最後的計算

自定義View總結筆記

例項 1 中直接new出來的 public cakeview context context 布局中引用 public cakeview context context,nullable attributeset attrs 布局中應用,並且帶style 不常用 public cakeview co...

Android自定義View相關總結

通常用於實現複雜的 不規則的效果,需要自己支援wrap content和padding。自定義圓形進度條元件的kotlin class mycircleprogress view constructor context context,attr attributeset super context,...

自定義view和viewGroup的總結

1 自定義屬性,並獲取自定義屬性 供使用者使用,達到配置效果 2 onmeasure 方法用於測量自己的寬高,前提是繼承自view,如果是繼承自系統的已有的textview button,則不用重寫這個方法,因為已經計算好了寬高 3 ondraw 用於繪製自定義view的想要的效果形狀等等 4 on...