android

Android:你要了解的自定義View基礎概念都在這裡了!


前言

自定義View原理是Android開發者必須瞭解的基礎,在瞭解自定義View之前,你需要有一定的知識儲備。

本文將全面解析關於自定義View中的所有知識基礎。

1. 檢視(View)定義

檢視(View)表現為顯示在螢幕上的各種檢視,如TextView、LinearLayout等。


**2. **檢視(View)分類

View主要分為兩類:

a. 單一檢視(View):即一個View,如TextView,不包含子View。

b. 檢視組(ViewGroup):即多個View組成的ViewGroup,如LinearLayout,包含子View。

Android中的UI元件都由View、ViewGroup組成。


3. View類簡介

View類是Android中各種元件的基類,如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);
    }

4. View檢視結構

對於多View的檢視,結構是樹形結構:最頂層是ViewGroup。

ViewGroup下可能有多個ViewGroup或View,如下圖:

[外鏈圖片轉存失敗(img-7adRxaFg-1569313524227)(https://upload-images.jianshu.io/upload_images/15679108-b00be1083de973c9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

一定要記住:

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


5.  Android的座標

Android的座標系定義為:

  • 螢幕的左上角為座標原點

  • 向右為x軸增大方向

  • 向下為y軸增大方向

具體如下圖:

[外鏈圖片轉存失敗(img-4CV5IXr9-1569313524228)(https://upload-images.jianshu.io/upload_images/15679108-af4bb15eaa7b2667?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

注:區別於一般的數學座標系

[外鏈圖片轉存失敗(img-rc7ieRVt-1569313524229)(https://upload-images.jianshu.io/upload_images/15679108-32da12ecc3b88915?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]


6. View位置(座標)描述

View的位置由4個頂點決定的(如下A、B、C、D)

[外鏈圖片轉存失敗(img-KYiSgbvw-1569313524238)(https://upload-images.jianshu.io/upload_images/15679108-4900eba68c76e15b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

4個頂點的位置描述分別由4個值決定:(請記住:View的位置是相對於父控制元件而言的)

  • Top:子View上邊界到父view上邊界的距離

  • Left:子View左邊界到父view左邊界的距離

  • Bottom:子View下邊距到父View上邊界的距離

  • Right:子View右邊界到父view左邊界的距離

[外鏈圖片轉存失敗(img-IHer9Gz3-1569313524239)(https://upload-images.jianshu.io/upload_images/15679108-8d5195d1f4bfa212?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

個人建議:按頂點位置來記憶:

  • Top:子View左上角距父View頂部的距離;

  • Left:子View左上角距父View左側的距離;

  • Bottom:子View右下角距父View頂部的距離;

  • Right:子View右下角距父View左側的距離。


7. 位置獲取方式

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();

具體如下圖:

[外鏈圖片轉存失敗(img-3bXpBkon-1569313524251)(https://upload-images.jianshu.io/upload_images/15679108-a9bdeb3db4690967?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]


8. 角度(angle)& 弧度(radian)

自定義View實際上是將一些簡單的形狀透過計算,從而組合到一起形成的效果。這會涉及到畫布的相關操作(旋轉)、正餘弦函式計算等,即會涉及到角度(angle)與弧度(radian)的相關知識。

角度和弧度都是描述角的一種度量單位,區別如下圖:

[外鏈圖片轉存失敗(img-N4wKvnI3-1569313524252)(https://upload-images.jianshu.io/upload_images/15679108-2ef48e62ee3a713c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

在預設的螢幕座標系中角度增大方向為順時針。

[外鏈圖片轉存失敗(img-Mars9B3i-1569313524254)(https://upload-images.jianshu.io/upload_images/15679108-695d903b79c2eeb2?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

注:在常見的數學座標系中角度增大方向為逆時針。


9. 顏色相關

Android中的顏色相關內容包括顏色模式,建立顏色的方式,以及顏色的混合模式等。

9.1 顏色模式

Android支援的顏色模式:

[外鏈圖片轉存失敗(img-jDg9wYMb-1569313524255)(https://upload-images.jianshu.io/upload_images/15679108-9c9b79b9927e78f3?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

以ARGB8888為例介紹顏色定義:

[外鏈圖片轉存失敗(img-xMaIIvbb-1569313524256)(https://upload-images.jianshu.io/upload_images/15679108-917333d3fe034b10?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

9.2 定義顏色的方式

9.2.1 在java中定義顏色

//java中使用Color類定義顏色
 int color = Color.GRAY;     //灰色

  //Color類是使用ARGB值進行表示
  int color = Color.argb(127, 255, 0, 0);   //半透明紅色
  int color = 0xaaff0000;                   //帶有透明度的紅色

9.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       //高精度 - 帶透明通道紅色

9.3 引用顏色的方式

9.3.1 在java檔案中引用xml中定義的顏色

//方法1
int color = getResources().getColor(R.color.mycolor);

//方法2(API 23及以上)
int color = getColor(R.color.myColor); 

9.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中定義的顏色-->
  :background="@color/red"     

 <!--在layout檔案中建立並使用顏色-->
  :background="#ff0000"        

9.4 取色工具

顏色都是用RGB值定義的,而我們一般是無法直觀的知道自己需要顏色的值,需要借用取色工具直接從圖片或者其他地方獲取顏色的RGB值。

有時候一些簡單的顏色選取就不用去麻煩UI了,開發者自己去選取效率更高。這裡,**取色工具我強推Markman:**一款設計師用於標註的工具,主要用於尺寸標註、字型大小標註、顏色標註,而且使用簡單。本人強烈推薦!

[外鏈圖片轉存失敗(img-K3yGDFry-1569313524257)(https://upload-images.jianshu.io/upload_images/15679108-dcb276e95287218a?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
《做Android這些坑你踩過嗎?(架構影片+面試專題文件+學習筆記)教你避坑》

本文章已修改原文用詞符合繁體字使用者習慣使其容易閱讀

版權宣告:此處為CSDN博主「Android小安」的原創文章,依據CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

原文連結:https://blog.csdn.net/Coo123_/article/details/101291897