Android自定義控件

如何自定義一個控件?

自定義控件可以分爲兩種自定義組合控件自定義 view

那什麼是自定義組合控件呢?

自定義組合控件就是把多個控件做爲一個整體看待、處理。這樣的好處不僅可以減輕 xml的代碼量,也提高了代碼的複用性。
*1. 聲明一個View 對象,繼承相對佈局,或者線性佈局或者其他的ViewGroup。
2. 在自定義的View 對象裏面重寫它的構造方法,在構造方法裏面就把佈局都初始化完畢。
3. 根據業務需求添加一些api 方法,擴展自定義的組合控件;
4. 希望在佈局文件裏面可以自定義一些屬性。
5. 聲明自定義屬性的命名空間。
6. 在res 目錄下的 values 目錄下創建attrs.xml 的文件聲明我們寫的屬性。
7. 在佈局文件中寫自定義的屬性。
8. 使用這些定義的屬性。自定義View 對象的構造方法裏面有一個帶兩個參數的構造方法佈局文件裏面定義的屬性都放在AttributeSet attrs,獲取那些定義的屬性。*

自定義view
自定義View 首先要實現一個繼承自View 的類。添加類的構造方法,通常是三個構造方法,不過從 Android5.0
開始構造方法已經添加到4個了。override父類的方法,如onDraw,(onMeasure)等。如果自定義的View有自
己的屬性,需要在values下建立attrs.xml文件,在其中定義屬性,同時代碼也要做修改。
blog 分享:http://blog.csdn.net/lmj623565791/article/details/24252901

請描述一下View的繪製流程?

整個View樹的繪圖流程是在ViewRoot.java類(該類位於Android源碼下面:
D:\AndroidSource_GB\AndroidSource_GB\frameworks\base\core\java\android\view)的
performTraversals()函數展開的,該函數做的執行過程可簡單概況爲根據之前設置的狀態,判斷是否需要重新計
算視圖大小(measure)、是否重新需要安置視圖的位置(layout)、以及是否需要重繪 (draw),其框架過程如下:
1、mesarue()過程
主要作用:爲整個View樹計算實際的大小,即設置實際的高(對應屬性:mMeasuredHeight)和寬(對應屬性:mMeasureWidth),每個View 的控件的實際寬高都是由父視圖和本身視圖決定的。
具體的調用鏈如下: ViewRoot根對象的屬性mView(其類型一般爲ViewGroup類型)調用measure()方法去
計算View樹的大小,回調View/ViewGroup 對象的onMeasure()方法,該方法實現的功能如下:1、設置本View 視圖的最終大小,該功能的實現通過調用 setMeasuredDimension()方法去設置實際的高(對應屬性:mMeasuredHeight)和寬(對應屬性mMeasureWidth)。
2 、如果該View 對象是個ViewGroup類型,需要重寫該onMeasure()方法,對其子視圖進行遍歷的measure() 過 程 。 對 每 個 子 視 圖 measure() 過 程 , 是 通 過 調 用 父 類 ViewGroup.java 類 裏 的
measureChildWithMargins()方法去實現,該方法內部只是簡單地調用了 View 對象的measure()方法。
2、layout 佈局過程
主要作用:爲將整個根據子視圖的大小以及佈局參數將 View樹放到合適的位置上。
具體的調用鏈如下:
1、layout 方法會設置該 View 視圖位於父視圖的座標軸,即 mLeft,mTop,mLeft,mBottom(調用setFrame()函數去實現)接下來回調onLayout()方法(如果該View 是ViewGroup對象,需要實現該方法,對每個子視圖進行佈局)。
2、如果該View 是個ViewGroup類型,需要遍歷每個子視圖 chiildView,調用該子視圖的 layout()方法去設置它的座標值。
3、draw()繪圖過程
由ViewRoot對象的performTraversals()方法調用draw()方法發起繪製該View 樹,值得注意的是每次發起繪
圖時,並不會重新繪製每個View樹的視圖,而只會重新繪製那些“需要重繪”的視圖,View 類內部變量包含了一個標誌位DRAWN,當該視圖需要重繪時,就會爲該View添加該標誌位。
調用流程 :
1 、繪製該View 的背景
2 、爲顯示漸變框做一些準備操作(大多數情況下,不需要改漸變框)
3、調用onDraw()方法繪製視圖本身(每個View 都需要重載該方法,ViewGroup不需要實現該方法)
4、調用dispatchDraw ()方法繪製子視圖(如果該 View 類型不爲ViewGroup,即不包含子視圖,不需要重載該方法)
值得說明的是,ViewGroup類已經爲我們重寫了dispatchDraw ()的功能實現,應用程序一般不需要重寫該方法,
但可以重載父類函數實現具體的功能。

參考blog分享:http://blog.csdn.net/qinjuning/article/details/7110211

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章