知識點整理
- 1.自定義View基礎
-
- 1.1 View的分類
- 1.2 View類簡介
-
- 1.2.1 自定義view的基本方式
- 1.2.2 自定義控件分類
- 1.3 AttributeSet與自定義屬性
- 1.4 View視圖結構
- 1.5 Android坐标系
- 1.6 Android 中顔色相關内容
1.自定義View基礎
1.1 View的分類
類别 | 解釋 | 特點 |
---|---|---|
單一視圖 | 即一個View,如TextView | 不包含子View |
視圖組 | 即多個View組成ViewGroup,如LinearLayout | 包含子View |
1.2 View類簡介
View類時Android中各種元件的基類,如View是ViewGroup基類
View表現為顯示在螢幕上的各種視圖
Android中的UI元件都是有View,ViewGroup組成
View的構造函數,公有4個:
// 如果View是在Java代碼裡面new的,則調用第一個構造函數
public CarsonView(Context context) {
super(context);
}
// 如果View是在.xml裡聲明的,則調用第二個構造函數
// 自定義屬性是從AttributeSet參數傳進來的
public CarsonView(Context context, AttributeSet attrs) {
super(context, attrs);
}
// 不會自動調用
// 一般是在第二個構造函數裡主動調用
// 如View有style屬性時
public CarsonView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//API21之後才使用
// 不會自動調用
// 一般是在第二個構造函數裡主動調用
// 如View有style屬性時
public CarsonView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
1.2.1 自定義view的基本方式
自定義View的最基本的三個方法分别是: onMeasure()、onLayout()、onDraw();
View在Activity中顯示出來,要經曆測量、布局和繪制三個步驟,分别對應三個動作:measure、layout和draw。
- 測量:onMeasure() 決定View的大小
- 布局:onLayout() 決定View 在View中的位置
- 繪制:onDraw() 決定繪制這個View
1.2.2 自定義控件分類
- 自定義View: 隻需要重寫onMeasure()和onDraw()
- 自定義ViewGroup: 則隻需要重寫onMeasure()和onLayout()
1.3 AttributeSet與自定義屬性
系統自帶的View可以在xml中配置屬性,對于寫的好的自定義View同樣可以在xml中配置屬性,為了使自定義的View的屬性可以在xml中配置,需要以下4個步驟:
- 通過
為自定義View添加屬性<declare-styleable>
- 在xml中為相應的屬性聲明屬性值
- 在運作時(一般為構造函數)擷取屬性值
- 将擷取到的屬性值應用到View
1.4 View視圖結構
1.ViewRoot在Activtiy啟動時建立,負責管理、布局、渲染視窗UI等等,View樹的繪制主要有ViewRoot負責,ViewRoot是View樹的管理者,負責将DecorView和phoneWindows組合起來。
2. PhoneWindow是Android系統中最基本的視窗系統,繼承自Windows類,負責管理界面顯示以及事件響應。它是Activity與View系統互動的接口
3.View的根節點嚴格來說就是 DecorView,繼承于View類,作為整個視圖容器來使用。用于設定視窗屬性。它本質上是一個FrameLayout
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn50dNpnTzEFVNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwIjM1ITMzMTM0EjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
對于多View的視圖,結構是樹形結構:最頂層是ViewGroup,ViewGroup下可能有多個ViewGroup或View,如下圖:
一定要記住:無論是measure過程、layout過程還是draw過程,永遠都是從View樹的根節點開始測量或計算(即從樹的頂端開始),一層一層、一個分支一個分支地進行(即樹形遞歸),最終計算整個View樹中各個View,最終确定整個View樹的相關屬性。
1.5 Android坐标系
Android的坐标系定義為:
- 螢幕的左上角為坐标原點
- 向右為x軸增大方向
- 向下為y軸增大方向
View的位置由4個頂點決定的
4個頂點的位置描述分别由4個值決定:
請記住:View的位置是相對于父控件而言的)
- Top:子View上邊界到父view上邊界的距離
- Left:子View左邊界到父view左邊界的距離
- Bottom:子View下邊距到父View上邊界的距離
- Right:子View右邊界到父view左邊界的距離
一.自定義View 基礎知識1.自定義View基礎 位置擷取方式
View的位置是通過view.getxxx()函數進行擷取:(以Top為例)
// 擷取Top位置
public final int getTop() {
return mTop;
}
// 其餘如下:
getLeft(); //擷取子View左上角距父View左側的距離
getBottom(); //擷取子View右下角距父View頂部的距離
getRight(); //擷取子View右下角距父View左側的距離
與MotionEvent中 get()和getRaw()的差別
//get() :觸摸點相對于其所在元件坐标系的坐标
event.getX();
event.getY();
//getRaw() :觸摸點相對于螢幕預設坐标系的坐标
event.getRawX();
event.getRawY();
1.6 Android 中顔色相關内容
Android支援的顔色模式:
以ARGB8888為例介紹顔色定義: