Canvas 在一般的情況下可以看作是一張畫布,所有的繪圖操作如drawBitmap, drawCircle都發生在這張畫布上,這張畫板還定義了一些屬性比如Matrix,顏色等等。
但是如果需要實現一些相對複雜的繪圖操作,比如多層動畫,地圖(地圖可以有多個地圖層疊加而成,比如:政區層,道路層,興趣點層)。
Canvas提供了圖層(Layer)支持,缺省情況可以看作是隻有一個圖層Layer。如果需要按層次來繪圖,Android的Canvas可以使用SaveLayerXXX, Restore 來創建一些中間層,對於這些Layer是按照“棧結構“來管理的:
創建一個新的Layer到“棧”中,可以使用saveLayer, savaLayerAlpha, 從“棧”中推出一個Layer,可以使用restore,restoreToCount。但Layer入棧時,後續的DrawXXX操作都發生在這個Layer上,而Layer退棧時,就會把本層繪製的圖像“繪製”到上層或是Canvas上,在複製Layer到Canvas上時,可以指定Layer的透明度(Layer),這是在創建Layer時指定的:
public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags)
本例Layers 介紹了圖層的基本用法:Canvas可以看做是由兩個圖層(Layer)構成的,爲了更好的說明問題,我們將代碼稍微修改一下,缺省圖層繪製一個紅色的圓,在新的圖層畫一個藍色的圓,新圖層的透明度爲0×88。
- public class Layers extends Activity{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(new SampleView(this));
- }
- private class SampleView extends View{
- private static final int LAYERS_FLAGS=Canvas.MATRIX_SAVE_FLAG|
- Canvas.CLIP_SAVE_FLAG |
- Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
- Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
- Canvas.CLIP_TO_LAYER_SAVE_FLAG;
- private Paint mPaint;
- public SampleView(Context context) {
- super(context);
- mPaint=new Paint();
- mPaint.setAntiAlias(true);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- super.onDraw(canvas);
- canvas.drawColor(Color.WHITE);
- canvas.translate(10, 10);
- mPaint.setColor(Color.RED);
- canvas.drawCircle(75, 75, 75, mPaint);
- canvas.saveLayerAlpha(0, 0, 200, 200, 0x88, LAYERS_FLAGS);
- mPaint.setColor(Color.BLUE);
- canvas.drawCircle(125, 125, 75, mPaint);
- canvas.restore();
- }
- }
- }
在調用canvas.saveLayerAlpha 創建一個新圖層之後,後續的canvas.drawCircle 都會發生的這個新圖層上, canvas.restore() 將這個新圖層繪製的圖像“複製”到Canvas的缺省圖層上,透明度爲0×88