android中的View的物件

2021-06-16 09:14:52 字數 2829 閱讀 6165

我們知道android sdk中的ui控制項都是view或viewgroup的子類(viewgroup也是view的子類),我們將view細分為單獨view和容器view兩種,所亦就衍生兩個檢視基類:view和viewgroup。通過擴充套件這兩個基類,android sdk提供了一系列害能強大,設計巧妙的ui控制項,但是使用者的需求是千變萬化的,sdk中不可能提供所有可能用到的ui形式,所亦這就需要允許使用者自定義view物件來完成他們所需要的效果。

幸好,android sdk有支援自定義view物件,它允許你自定義乙個類,繼承android.view.view物件,然後你只需要調整它裡面的一些方法即可,那到底要重寫哪些方法呢?如果你對android.view.view本身都不是很熟悉的話,那怎麼會自定義view呢,就像是還不會走路,怎麼就想學跑步了,所亦我們首先要先了解一些關於view的東西。

了解android.view.view

我們在了解activity時就有提到,只要有能看到的ui介面,就一定有activity。這邊所說的ui介面就是指view物件,所亦view和activity離不開關係。當activity處於active狀態時(activity獲取了當前的焦點),它就發出請求要求繪製activity中的view物件。系統根據檢視的關係層次從根節點出發開始繪製直到所有的葉子節點(因為view是有層次關係的),整個繪製過程中view和viewgroup的實現形式是不一樣的,因為viewgroup裡面會有子檢視物件,所亦它需要請求子檢視執行繪製,整個檢視樹執行繪圖的順序是中序遍歷,從根節點先畫,最後才是子節點。如果是view那麼只要確定了它的大小即可執行繪製方法。

繪製viewgroup時可亦分為兩個步驟:measure測量過程和layout布局過程。measure是用來測量viewgroup所占用的尺寸,它按照中序遍歷的方式遞迴呼叫子檢視的measure方法,然後儲存各個子檢視對應測量出來的結果。當measure測量完成後就會呼叫layout過程,layout過程也是使用中序遍歷遞迴呼叫,它做的工作是確定每個父檢視的尺寸,因為在measure階段已經完成了所有的子檢視尺寸,所亦父檢視的尺寸也可亦通過它計算出來。

當measure測量執行完成後,你就已經知道每個檢視所需的尺寸了,所亦你需要設定值,讓getmeasurewidth和getmeasureheight方法可亦獲取測量得到的結果。measure測量的結果必須考慮父檢視設定的長度,確保測量完成後得到的結果滿足:所有的父檢視的尺寸都能裝得下它們各自的所有子檢視。乙個父檢視可能會多次呼叫它的子檢視的measure方法,因為檢視可亦設定成最大尺寸(fill_parent),它首先會不限制子檢視的大小,讓子檢視能盡量大,但是如果有兩個子檢視都採用最大尺寸(fill_parent),那麼只能採取折中方式。

measure測量過程用兩個類來協助確定尺寸:measurespec和layoutparams。measurespec用來對父檢視描述它需要的尺寸或位置,layoutparams用來描述它需要的寬度和高度,它可定義的尺寸分為3種模型:

確定值:直接確定它的大小fill_parent:填充父檢視的空間(最大占用空間)wrap_content:能剛好顯示出檢視內容的大小區域即可(最小占用空間)

measurespec用來讓父檢視通知子檢視,子檢視所能分配的大小,它分為下面3種模型:

unspecified:讓父檢視直接按照子檢視需求的尺寸進行分配,比如乙個linearlayout在measure中就對子檢視使用unspecified模型,它不限制大小,按照子檢視的需求進行分配。exactly:強迫子檢視的尺寸必須按照父檢視分配的尺寸進行測量,如果子檢視的實際尺寸比這個尺寸大則需要縮小,如果子檢視的實際尺寸比這個尺寸小則需要擴大。at_most:強迫讓子檢視使用最大的尺寸,子檢視的尺寸不得大於父檢視定義的最大尺寸,但是可亦小於這個最大尺寸值(跟exactly不一樣的是它可亦小於這個尺寸值)。建立自定義view物件

了解了view測量和繪製的原理後,你就可亦通過繼承它,重寫特定的方法建立乙個自定義view物件。一般建立自定義view的用途是:

1. 自定義檢視物件,建立乙個sdk沒提供的布局形式,如accordion。

2. 將多個view物件組合起來封裝成乙個新的自定義view物件,如combox就是由乙個下拉列表和乙個輸入框和輸入框右邊乙個按鈕組成的。

3. 改寫edittext物件,android sdk中的記事本例子就使用了擴充套件edittext的檢視,它在每行文字的下面畫一條藍色的線。

4. 建立乙個遊戲面板,捕捉一些鍵盤或觸控事件做出一些特定的處理。

如何建立自定義view物件

主要有下面幾個步驟:

1. 建立乙個自定義類,繼承android.view.view。

2. 重寫父類構造方法,你可亦在構造方法中獲取在xml布局檔案裡設定的屬性,你可亦從這裡讀取一些自定義的屬性配置view物件。

3. 重寫父類(view)的方法,這邊可亦根據需要修改的程度有選擇的重寫,這些重寫的方法都是on開頭的方法如:ondraw、onmeasure或onkeydown(這些跟activity生命週期中的oncreateonpause…一樣也算繪製過程的生命週期)。如果你沒有重寫ondraw預設它不做任何事,所亦你會看到一片空白區域,onmeasure缺省會建立乙個100 * 100的區域

4. 使用這個物件

一般我們如果沒有在xml布局檔案中使用一些自定義的配置屬性可亦不用重寫構造方法,這時候我們只需要重寫onmeasure和ondraw方法。onmeasure方法被呼叫時有兩個引數:widthmeasurespec和heightmeasurespec這個引數是int型,用來表示寬度和高度的尺寸,在onmeasure中必須根據這兩個引數確定view的寬度和高度值,然後呼叫setmeasuredimension(int widthint height)方法設定檢視的顯示區域範圍,否則將會丟擲異常。在ondraw方法中,會有乙個呼叫引數:canvas,你可亦使用它進行繪製view的操作。

本文**:

Android中View的測量

即精確值模式,當我們將空間的width或height制定為具體值 或者為match parent時,此時將佔據父容器的大小,使用的就是exactly。最大值模式,當空間的寬高屬性制動為自適應wrap content時,控制項大小一般隨著空間的子空間或內容的變化而發生改變,此時view的尺寸只要不超過...

android 中 View的建構函式

今天在照著android瘋狂講義中的 來敲,敲完後執行錯誤,仔細檢視才知道自己沒有重寫view中的構造方法 實現跟隨手勢的小球的 public view context context public view context context,attributeset attrs,int defsty...

Android中View繪製優化

1.優化布局層次 2.使用標籤復用布局檔案 includelayout layout titlebar 關於標籤的第乙個比較簡單的用法 關於使用標籤的一些限制 1 它只能作為xml布局宣告的root元素來使用 2 使用它來inflate乙個布局時,必須指定乙個viewgroup例項作為其父元素並且設...