自定義控件分為兩種一種是自定義ViewGroup控件,一種是自定義View控件;跟蹤View的步伐其實能跟到Java實現的最下面我們能發現的也就只有Canvas了,再下去就是C++或C實現了;所以本文主要是站在設計的的角度講解一下Canvas跟View的關系,再簡單分析一下Canvas用法;
View作為Android中一切顯示視圖的父類,我們可看到它的繪制方法draw(Canvas canvas)中,無非也是通過Canvas的繪制來達到各種View的顯示,如此Android中各種控件如:ImageView,TextView,EditTextView等都是通過Canvas根據傳遞的各個參數繪制不同的視圖,從而形成各種不同的視覺控件;當然我們也可以通過繼承View的onDraw方法,用Canvas繪制一些自定義圖像,這就是最簡單的自定義控件了,當然如果需要各種事件響應,就需深刻了解View的事件處理邏輯。
這裡做個簡單的比喻:如果把一個Android界面比喻成窗戶,那麼每一個View就是一塊玻璃,整個框架就是ViewGroup了,而每一塊玻璃上的圖案就是我們說的Canvas,如果沒有Canvas我們是什麼都看不到的(只有透明的玻璃),而接收各種事件處理還是由玻璃(View)接收處理,通知刷新圖案就是(Canvas)了,這就是簡單的View與Canvas的關系。很明顯,它們分工很明確,View只需要負責處理事件交互,而Canvas只負責根據View提供的參數來顯示與刷新圖像。當然如果你要多個View同時顯示那就需要VIewGroup參與了。下面學習一下Canvas的基本用法:
Canvas基本用法分為兩種:
1、直接在View的onDraw方法裡面直接繪制;(這是有載體View(上面例子的玻璃)的情況下直接繪制圖案,比如我們可以復寫系統控件,根據需要再添加或修改我們需要的元素)
2、Canvas canvas = new Canvas(),這裡僅僅是New的一個畫布,我們是看不到的,它也無法處理任何事件,僅僅繪制修飾圖像,至於顯示與接收事件處理必須要有載體(View)才行;
Canvas有很多自己的繪制方法,但是最終都是調用底層代碼實現:下面分類介紹一下Canvas常用方法:
1、save,saveLayer,restore方法保存與還原;
save(int saveFlags);可以指定還原哪些內容:
源碼:
復制代碼
// the SAVE_FLAG constants must match their native equivalents
/** restore the current matrix when restore() is called */
public static final int MATRIX_SAVE_FLAG = 0x01;
/** restore the current clip when restore() is called */
public static final int CLIP_SAVE_FLAG = 0x02;
/** the layer needs to per-pixel alpha */
public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 0x04;
/** the layer needs to 8-bits per color component */
public static final int FULL_COLOR_LAYER_SAVE_FLAG = 0x08;
/** clip against the layer's bounds */
public static final int CLIP_TO_LAYER_SAVE_FLAG = 0x10;
/** restore everything when restore() is called */
public static final int ALL_SAVE_FLAG = 0x1F;
復制代碼
saveLayer(RectF bounds, Paint paint, int saveFlags);Canvas利用此方法進行圖層管理,可以根據區域保存當前圖層,繪制完成之後利用restoreToCount將圖層綁定;
2、draw方法;
drawColor,drawRGB,drawARGB,繪制顏色
drawPath,drawLines,drawOval等繪制幾何圖形;
drawBitmap,drawPictur繪制圖片 ;
drawText繪制文字;
3、clipRegion,clipPath,clipRect裁剪,這裡特別注意的有兩種:
一是Region.Op中各種參數的含義;
二是Clip(剪切)的時機,是在canvas繪制之前完成對canvas的裁剪,而不是圖像;
4、還有一些是與動畫相關的Matrix操作,總共分為translate(平移),rotate(旋轉),scale(縮放)和skew(傾斜)四種; 這裡特意說明一下,這裡Canvas進行matrix變化的時候相對坐標為(0,0);我們進行任何操作的時候,注意canvas.translate(scrollX, scrollY);canvas.translate(-scrollX, -scrollY);的意義。
Canvas具體用法這裡不再闡述了,網上資料多多。。