Android layer圖層是什麼?
從字面上看android中的layer就是圖層的意思,一般用于android中自定義控件的繪制中。從字面上意思看很像photoshop中的圖層概念,也就是說大于1張圖層以上重疊的圖層組,進而可以建立一個複雜的圖層,photoshop裡面一張漂亮的畫都是由多張圖層來完成的。在android中layer是跟canvs配合使用,建立一個圖層可以使用canvas.saveLayer()來建立,圖層是基于棧結構進行管理的。
如圖:

Android layer圖層做什麼?
Layer作用當然就是做複雜的界面,Android通過調用saveLayer()方法或者是saveLayerAlpha()方法将一個圖層入棧,使用restore()方法、restoreToCount()方法将一個圖層出棧。然而入棧的時候,後面所有的操作都發送在這個入棧的圖層之上,而出棧的時候,則會把圖像會知道上層的Canvas上。接下來通過代碼來看看如何使用Layer。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//圖層一
canvas.drawColor(Color.WHITE);//白色底色圖層
mPaint.setColor(Color.BLACK);
canvas.drawCircle(, , , mPaint);//黑色圓形
//圖層二
canvas.saveLayerAlpha(, , , , , Canvas.ALL_SAVE_FLAG);
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(, , , mPaint);//黃色圓形
canvas.restore();//合并
}
運作後效果:
介紹一下saveLayerAlpha()參數如下:
參數12345分别如下:
左上右下,alpha透明度,參數的取值是0到255 。127半透明效果,255完全不透明,0完全透明。是以圖層就如
接下來要解釋一下
saveFlags:代表了需要儲存哪方面的内容,這裡一共有6種取值,分别是:
如圖1
(1)MATRIX_SAVE_FLAG(首先我們把透明度Alpha設定255完全不透明)
MATRIX_SAVE_FLAG:意思是隻儲存圖層的matrix矩陣。
Android對于圖檔的處理,最長使用到的資料結構是位圖–Bitmap,他包含了一張圖檔的所有資料。整個圖檔獨食由點陣和顔色值組成的,所謂點陣就是一個包含像素的矩陣,每個元素對應圖檔的一個像素點。
我們來看Bitmap源碼就會發現
從canvas的構造函數中也可以看出matrix影子,canvas繪制會發生在Bitmap身上,bitmap的操作也是通過matrix來進行的。 運作效果:
(2)CLIP_SAVE_FLAG
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//圖層一
canvas.drawColor(Color.WHITE);
mPaint.setColor(Color.BLACK);
canvas.drawCircle(, , , mPaint);
//圖層二
canvas.saveLayerAlpha(, , , ,, Canvas.CLIP_SAVE_FLAG);
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(, , , mPaint);
canvas.restore();
}
運作後,與(1)結果相同,效果相同主要就是儲存裁剪的相關資訊。
(3)HAS_ALPHA_LAYER_SAVE_FLAG和FULL_COLOR_LAYER_SAVE_FLAG
HAS_ALPHA_LAYER_SAVE_FLAG為layer添加一個透明通道,這樣一來沒有繪制的地方就是透明的,覆寫到上一個layer的時候,就會顯示出上一層的圖像。而FULL_COLOR_LAYER_SAVE_FLAG 則會完全展示目前layer的圖像,清除掉上一層的重合圖像。
(4)CLIP_TO_LAYER_SAVE
//圖層一
canvas.drawColor(Color.RED);
mPaint.setColor(Color.WHITE);
//圖層二
canvas.saveLayer(, , , , mPaint, Canvas.CLIP_SAVE_FLAG);//裁剪後儲存,底色紅色
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(, , , mPaint);
canvas.restore();
這裡可以看出裁切之後,原來圖層和裁切後的圖層繼續合并了
(5)CLIP_TO_LAYER_SAVE_FLAG
//圖層一
canvas.drawColor(Color.RED);
mPaint.setColor(Color.WHITE);
//圖層二
canvas.saveLayer(, , , , mPaint, Canvas.CLIP_TO_LAYER_SAVE_FLAG);
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(, , , mPaint);
canvas.restore();
這裡可以看出來隻儲存裁切後的圖層。
canvas.saveLayerAlpha()與 canvas.saveLayer()差別;
canvas.saveLayerAlpha()就是建立一個帶有透明度圖層的圖層, canvas.saveLayer()建立一個透明圖層竟此而已。