获取Canvase方法
-
无论是View还是ViewGroup,调用顺序都是onDraw(),dispatchDraw()。 在ViewGroup中,当他有背景时会调用onDraw(),否则掉过,调用dispatchDraw()绘制子视图。
-
Canvas canvas = new Canvas(bitmap);
或Canvas canvas = new Canvas(); canvas.setBitmap(bitmap);
-
SurfaceHolder.lockCanvas()
saveLayer()函数
public int saveLayer(RectF bounds,Paint paint,int saveFlags)
public int saveLayer(float left,float top,float right,float bottom,Paint paint,int saveFlags)
saveLayer会创建一个新的透明画布,大小与指定保存的区域大小一致。绘制结束后会直接覆盖原始画布上。 我们在posterduffXermode中,创建savelayer是因为在原canvas上会污染我们想要的dst和src元素,也就是saveLayer后,只对新画布上的元素处理,避免原canvas上的元素影响。
注:canvas.save()不会创建一个新的画布
图层:canvas.drawXXX 都会创建一个透明图层来绘制这个图形
画布:每一块都是一个Bitmap,所有图像都画在这个Bitmap上,画布有View的onDraw(Canvas canvas)的原始画布, 也有new Canvas(bitmap),saveLayer()创建的画布
Canvas:画布的表现形式,一种绘图工具,最终通过canvas画到bitmap上。
saveLayer一般是 int layerId = canvas.saveLayer() 和canvas.restore(layerId)搭配使用
saveLayerAlpha()函数
比saveLayer多一个alpha参数,用于指定画布透明度,取值0-255。
saveFlags参数
当既没有指定 HAS_ALPHA_LAYER_SAVE_FLAG 标识也没有指定 FULL_COLOR_ LAYER_SAVE_FLAG 标识时,系统默认使用 FULL_COLOR_LAYER_SAVE_FLAG 标识。
恢复画布 restoreToCount(int count)和resotre()
无论哪种save函数、哪个Flag,保存画布使用的都是同一个栈/