Android 自定義view深入剖析
前言
- 自定義View原理是Android開發者必須瞭解的基礎;
- 在瞭解自定義View之前,你需要有一定的知識儲備;
- 本文將全面解析關於自定義View中的所有知識基礎。
目錄
1. View的分類
檢視View主要分為兩類:
類別 | 解釋 | 特點 |
---|---|---|
單一檢視 | 即一個View,如TextView | 不包含子View |
檢視組 | 即多個View組成的ViewGroup,如LinearLayout | 包含子View |
2. View類簡介
- View類是Android中各種元件的基類,如View是ViewGroup基類
-
View表現為顯示在螢幕上的各種檢視
Android中的UI元件都由View、ViewGroup組成。
-
View的建構函式:共有4個,具體如下:
自定義View必須重寫至少一個建構函式:
// 如果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); }
更加具體的使用請看:深入理解View的建構函式和
理解View的建構函式
3. View檢視結構
對於多View的檢視,結構是樹形結構:最頂層是ViewGroup,ViewGroup下可能有多個ViewGroup或View,如下圖:
請記住:無論是measure過程、layout過程還是draw過程,永遠都是從View樹的根節點開始測量或計算(即從樹的頂端開始),一層一層、一個分支一個分支地進行(即樹形遞迴),最終計算整個View樹中各個View,最終確定整個View樹的相關屬性。
4. Android座標系
Android的座標系定義為:
- 螢幕的左上角為座標原點
- 向右為x軸增大方向
- 向下為y軸增大方向
具體如下圖:
注:區別於一般的數學座標系
5. View位置(座標)描述
- View的位置由4個頂點決定的(如下A、B、C、D)
4個頂點的位置描述分別由4個值決定:
(請記住:View的位置是相對於父控制元件而言的)
- Top:子View上邊界到父view上邊界的距離
- Left:子View左邊界到父view左邊界的距離
- Bottom:子View下邊距到父View上邊界的距離
- Right:子View右邊界到父view左邊界的距離
如下圖:
個人建議:按頂點位置來記憶:
- Top:子View左上角距父View頂部的距離;
- Left:子View左上角距父View左側的距離;
- Bottom:子View右下角距父View頂部的距離
- Right:子View右下角距父View左側的距離
6. 位置獲取方式
- 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();
具體如下圖:
7. Android的角度(angle)與弧度(radian)
-
自定義View實際上是將一些簡單的形狀通過計算,從而組合到一起形成的效果。
這會涉及到畫布的相關操作(旋轉)、正餘弦函式計算等,即會涉及到角度(angle)與弧度(radian)的相關知識。
-
角度和弧度都是描述角的一種度量單位,區別如下圖::
在預設的螢幕座標系中角度增大方向為順時針。
注:在常見的數學座標系中角度增大方向為逆時針
8. Android中顏色相關內容
Android中的顏色相關內容包括顏色模式,建立顏色的方式,以及顏色的混合模式等。
8.1 顏色模式
Android支援的顏色模式:
以ARGB8888為例介紹顏色定義:
8.2 定義顏色的方式
8.2.1 在java中定義顏色
//java中使用Color類定義顏色
int color = Color.GRAY; //灰色
//Color類是使用ARGB值進行表示
int color = Color.argb(127, 255, 0, 0); //半透明紅色
int color = 0xaaff0000; //帶有透明度的紅色
8.2.2 在xml檔案中定義顏色
在/res/values/color.xml 檔案中如下定義:
<?xml version="1.0" encoding="utf-8"?>
<resources>
//定義了紅色(沒有alpha(透明)通道)
<color name="red">#ff0000</color>
//定義了藍色(沒有alpha(透明)通道)
<color name="green">#00ff00</color>
</resources>
在xml檔案中以”#“開頭定義顏色,後面跟十六進位制的值,有如下幾種定義方式:
#f00 //低精度 - 不帶透明通道紅色
#af00 //低精度 - 帶透明通道紅色
#ff0000 //高精度 - 不帶透明通道紅色
#aaff0000 //高精度 - 帶透明通道紅色
8.3 引用顏色的方式
8.3.1 在java檔案中引用xml中定義的顏色:
//方法1
int color = getResources().getColor(R.color.mycolor);
//方法2(API 23及以上)
int color = getColor(R.color.myColor);
8.3.2 在xml檔案(layout或style)中引用或者建立顏色
<!--在style檔案中引用-->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/red</item>
</style>
<!--在layout檔案中引用在/res/values/color.xml中定義的顏色-->
android:background="@color/red"
<!--在layout檔案中建立並使用顏色-->
android:background="#ff0000"
--------------------- 作者:Carson_Ho 來源:CSDN 原文:https://blog.csdn.net/carson_ho/article/details/56009827?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!