Canvas 笔记

35 阅读1分钟

获取Canvase方法

  1. 无论是View还是ViewGroup,调用顺序都是onDraw(),dispatchDraw()。 在ViewGroup中,当他有背景时会调用onDraw(),否则掉过,调用dispatchDraw()绘制子视图。

  2. Canvas canvas = new Canvas(bitmap);

    或Canvas canvas = new Canvas(); canvas.setBitmap(bitmap);

  3. 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参数

image.png

当既没有指定 HAS_ALPHA_LAYER_SAVE_FLAG 标识也没有指定 FULL_COLOR_ LAYER_SAVE_FLAG 标识时,系统默认使用 FULL_COLOR_LAYER_SAVE_FLAG 标识。

恢复画布 restoreToCount(int count)和resotre()

无论哪种save函数、哪个Flag,保存画布使用的都是同一个栈/