天天看點

一.自定義View 基礎知識1.自定義View基礎

知識點整理

  • 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個步驟:

  1. 通過

    <declare-styleable>

    為自定義View添加屬性
  2. 在xml中為相應的屬性聲明屬性值
  3. 在運作時(一般為構造函數)擷取屬性值
  4. 将擷取到的屬性值應用到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

一.自定義View 基礎知識1.自定義View基礎

對于多View的視圖,結構是樹形結構:最頂層是ViewGroup,ViewGroup下可能有多個ViewGroup或View,如下圖:

一.自定義View 基礎知識1.自定義View基礎

一定要記住:無論是measure過程、layout過程還是draw過程,永遠都是從View樹的根節點開始測量或計算(即從樹的頂端開始),一層一層、一個分支一個分支地進行(即樹形遞歸),最終計算整個View樹中各個View,最終确定整個View樹的相關屬性。

1.5 Android坐标系

Android的坐标系定義為:

  • 螢幕的左上角為坐标原點
  • 向右為x軸增大方向
  • 向下為y軸增大方向
一.自定義View 基礎知識1.自定義View基礎

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支援的顔色模式:

一.自定義View 基礎知識1.自定義View基礎

以ARGB8888為例介紹顔色定義:

一.自定義View 基礎知識1.自定義View基礎

繼續閱讀