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

前言:

現組建了一個Android的水友圈,進羣可免費領取Android的高級UI及跨平臺技術,還有jvm性能優化,APP小程序源碼等資料;有從初始Android到Android進階視頻學習,包括Android開源實戰,文末有進圈方式。

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,以下圖:
必定要記住: 不管是measure過程、layout過程仍是draw過程,永遠都是從View樹的根節點開始測量或計算(即從樹的頂端開始),一層一層、一個分支一個分支地進行(即樹形遞歸),最終計算整個View樹中各個View,最終肯定整個View樹的相關屬性。
5. Android的座標 Android的座標系定義爲:
  • 屏幕的左上角爲座標原點
  • 向右爲x軸增大方向
  • 向下爲y軸增大方向
具體以下圖:
注:區別於通常的數學座標系

6. 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左側的距離。
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();複製代碼
具體以下圖:
8. 角度(angle)& 弧度(radian) 自定義View其實是將一些簡單的形狀經過計算,從而組合到一塊兒造成的效果。這會涉及到畫布的相關操做(旋轉)、正餘弦函數計算等,即會涉及到角度(angle)與弧度(radian)的相關知識。 角度和弧度都是描述角的一種度量單位,區別以下圖:
在默認的屏幕座標系中角度增大方向爲順時針。
注:在常見的數學座標系中角度增大方向爲逆時針。 9. 顏色相關 Android中的顏色相關內容包括顏色模式,建立顏色的方式,以及顏色的混合模式等。 9.1 顏色模式 Android支持的顏色模式:
以ARGB8888爲例介紹顏色定義:
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中定義的顏色-->
  android:background="@color/red"     

 <!--在layout文件中建立並使用顏色-->
  android:background="#ff0000"        複製代碼
9.4 取色工具 顏色都是用RGB值定義的,而咱們通常是沒法直觀的知道本身須要顏色的值,須要借用取色工具直接從圖片或者其餘地方獲取顏色的RGB值。 有時候一些簡單的顏色選取就不用去麻煩UI了,開發者本身去選取效率更高。這裏,取色工具我強推Markman:一款設計師用於標註的工具,主要用於尺寸標註、字體大小標註、顏色標註,並且使用簡單。本人強烈推薦!

最後

一點題外話:
咱們有《Android學習、面試;文檔、視頻資源免費獲取》,可複製連接後用石墨文檔 App 或小程序打開連接或者留言「資料」領取。

https://shimo.im/docs/TG8PDh9D96WGTT8Wjava


 ​
當程序員容易,當一個優秀的程序員是須要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每一個階段都須要掌握不一樣的能力。早早肯定本身的職業方向,才能在工做和能力提高中甩開同齡人。
若是你以爲文章寫得不錯就給個讚唄?若是你以爲那裏值得改進的,請給我留言。必定會認真查詢,修正不足。謝謝。
相關文章
相關標籤/搜索