1. 程式人生 > >自定義控制元件之繪圖篇:Canvas與圖層(二)

自定義控制元件之繪圖篇:Canvas與圖層(二)

public class CLIP_TO_LAYER_SAVE_FLAG_VIEW extends View {  
    private Paint mPaint;  
    public CLIP_TO_LAYER_SAVE_FLAG_VIEW(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
        mPaint = new Paint();  
        mPaint.
setColor(Color.GREEN);       }          @Override       protected void onDraw(Canvas canvas) {           super.onDraw(canvas);           canvas.drawColor(Color.RED);           canvas.saveLayer(0, 0, 500, 500, mPaint, Canvas.CLIP_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG);           canvas.restore();              canvas.
drawColor(Color.YELLOW);       }   }  
效果圖如下:

從效果圖中可以看出canvas被恢復了,不過canvas被恢復也,也就失去了Canvas.CLIP_TO_LAYER_SAVE_FLAG標識的意義了。 
所以這個CLIP_TO_LAYER_SAVE_FLAG標識的結論來了:
1、CLIP_TO_LAYER_SAVE_FLAG意義是在新建bitmap前,先把canvas給裁剪,一旦畫板被裁剪,那麼其中的各個畫布都會被受到影響。而且由於它是在新建bitmap前做的裁剪,所以是無法恢復的; 
2、當CLIP_TO_LAYER_SAVE_FLAG與CLIP_SAVE_FLAG標識共用時,在呼叫restore()後,畫布將被恢復


6、FLAG之ALL_SAVE_FLAG

這個標識是我們最常用的,它是所有標識的公共集合。 
對於save(int flag)來講,ALL_SAVE_FLAG = MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG;即儲存位置資訊和裁剪資訊 
對於save(int flag)來講,ALL_SAVE_FLAG = MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG很容易理解,因為save(int flag)函式只能使用MATRIX_SAVE_FLAG 、CLIP_SAVE_FLAG這兩個標識。 
對於saveLayer(int flag)來講,ALL_SAVE_FLAG = MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG|HAS_ALPHA_LAYER_SAVE_FLAG;即儲存儲存位置資訊和裁剪資訊,新建畫布在與上一層畫布合成時,不清空原畫布內容。
原本來講saveLayer的ALL_SAVE_FLAG標識應當是它所能使用的所有標識的集合,即應當是ALL_SAVE_FLAG = MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG|HAS_ALPHA_LAYER_SAVE_FLAG|FULL_COLOR_LAYER_SAVE_FLAG|CLIP_TO_LAYER_SAVE_FLAG,但由於HAS_ALPHA_LAYER_SAVE_FLAG與FULL_COLOR_LAYER_SAVE_FLAG共用時以HAS_ALPHA_LAYER_SAVE_FLAG為主,CLIP_TO_LAYER_SAVE_FLAG與CLIP_SAVE_FLAG共用時,CLIP_TO_LAYER_SAVE_FLAG將無效,所以最終ALL_SAVE_FLAG = MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG|HAS_ALPHA_LAYER_SAVE_FLAG; 
在理解了上面各個TAG的樣式以後,這個TAG的難度幾乎沒有,這裡就不再舉例了。

四、restore()與restoreToCount()

1、restore()

restore()的作用就是把回退棧中的最上層畫布狀態出棧,恢復畫布狀態。在《自定義控制元件之繪圖篇(四):canvas變換與操作》中已經詳細地說明了restore()函式的用法。這裡就不再細講了

2、restoreToCount(int count)

先看下這幾個save系列函式的宣告