前言
我覺得 Android UI 的一個很重要的東西就是 View,關於 View 我瞭解的並不多,所以我的打開了 Android 中 View 的源碼瞧了瞧,2萬多行的代碼,瞬間傻眼!!對於我們初學者來講學習View的目的無非就是學會使用各種 UI 控件以及自定義 View。
自定義View
自定義 View 在我看來就是畫圖。當然 Android 系統已經定義了 View,所以通常都是重寫一些系統框架在所有的 View 上調用的基本方法。一下是自定義 View 的基本流程。
- 自定義 View 的屬性
- 在 View 的構造方法中獲得我們自定義的屬性
- 重寫 onMesure
- 重寫 onDraw
View 中的方法
下面對 View 中的一些方法進行分類描述
創建
構造方法: View 中有兩種類型的構造方法,一種是在代碼中構建View,另一種是填充佈局文件構建 View,第二種構造方法要解析並應用佈局文件中定義的任何屬性。
onFinishInflate(): 在來自於 XML 的 View 和它所有的子節點填充之後被調用。
佈局
onMeasure: 調用該方法來確定 view 及它所有子節點需要的尺寸onLayout 當 view 需要爲它的所有子節點指定大小和佈局時,此方法被調用
onSizeChanged: 當這個 view 的大小發生變化時,此方法被調用
繪製
onDraw: 當 view 渲染它的內容時被調用
事件處理
onKeyDown 當一個新的按鍵事件發生時被調用
onKeyUp 當一個按鍵按起時被調用
onTrackballEvent 當軌跡球動作事件發生時被調用
onTouchEvent 當觸屏動作發生時被調用焦點
焦點
onFocusChanged: 當 view 獲得或是失去焦點時被調用
onWindowFocusChanged: 當包含 view 的窗口獲得焦點或是失去焦點時被調用
ID
關於 View 的 ID,只是用於標記 View。
位置
View 的幾何形狀是一個矩形,view 的位置由矩形的左上角的 x,y 座標及矩形的高度和寬度決定,他們的單位都是像素。
通過 getLeft 和 getTop 方法可以獲得 view 相對於它的直接父節點的x,y座標。
此外,還有一些便利的方法可以幫助我們減少計算量,比如 getRight 和getBottom 方法,調用 getRight 等價於 getLeft()+getWidth() 方法,
同理 getBottom 等價於 getTop()+getHeight() 方法。
大小
一個 View 的大小由它的寬度和高度來表達,一個View實際上擁有兩對寬高值。
第一對寬高值是:測量過的寬度和高度,即 view 想從它的父節點獲得的寬高值,可以通過 getMeasuredWidth() 方法和 getMeasuredHeight() 方法獲得。
第二對寬高值是:繪製的寬度和高度,即View的實際寬度和高度,是在佈局之後,繪製 View 階段的寬高值,這與上面提到的寬高值可能不同。通過getWidth() 方法和 getHeight() 方法可以獲得 View 的實際寬度和高度。
padding
padding 同 css 中的 padding 屬性。通過 setPadding(int,int,int,int) 可以設置 View 的 padding,通過 getPaddingXXX() 方法可以獲得 View 中對應方向的 padding,XXX指得是 left,right,top,bottom。