Android自定义控件开发入门与实战(12)Canvas,kotlin入门潜修

  • RectF bounds:要保存的区域所对应的举行对象

  • int saveFlags:取值ALL_SAVE_FLAG表示保存全部内容。别的值之后再讲述。

第二个构造函数其实和第一个一样,只不过它是根据4个点来构造一个矩形的。

下面我们接下来以Xfermode为例,看看saveLayer()函数都做了什么。

我们先使用Xfermode来做一个SRC_IN的效果:

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawColor(Color.GREEN);

int layerId = canvas.saveLayer(0, 0, width * 2, height * 2, mPaint, Canvas.ALL_SAVE_FLAG);

canvas.drawBitmap(dstBmp, 0, 0, mPaint);

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

canvas.drawBitmap(srcBmp, width / 2, height / 2, mPaint);

mPaint.setXfermode(null);

canvas.restoreToCount(layerId);

}

在saveLayer之前就用绿色画笔填充了背景,效果如下:

Android自定义控件开发入门与实战(12)Canvas,kotlin入门潜修_第1张图片

那么如果这个时候我们把saveLayer函数去掉,会发生什么呢?

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawColor(Color.GREEN);

canvas.drawBitmap(dstBmp, 0, 0, mPaint);

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

canvas.drawBitmap(srcBmp, width / 2, height / 2, mPaint);

mPaint.setXfermode(null);

}

效果如下:

Android自定义控件开发入门与实战(12)Canvas,kotlin入门潜修_第2张图片

这个时候,区域二居然显示出来了,这完全不符合SRC_IN的算法规则呀,为什么会出现这种情况呢?

1、调用saveLayer的绘图流程:

在调用saveLayer()函数时,会生成一块全新的画布,这块画布的大小就是我们所指定的所要保存区域的大小。新生成的画布是完全透明的,在调用saveLayer函数后所有的绘图都在这上面进行。

在利用Xfermode绘图时,会把之前画布上所有的内容都作为目标图像,而在调用saveLayer函数新生成的画布上,只有dstBmp对应的

你可能感兴趣的:(程序员,架构,移动开发,android)