自定義控制元件之繪圖篇:Canvas與圖層(二)
阿新 • • 發佈:2019-02-06
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的難度幾乎沒有,這裡就不再舉例了。