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

本文深入探讨了Android中的Canvas使用,特别是与SurfaceView的结合,以及saveLayer函数的作用。通过示例解释了saveLayer如何保存和恢复画布状态,特别是在涉及Xfermode时的影响。详细阐述了saveLayer的绘图流程,强调了其在防止错误显示方面的重要性,并对比了无saveLayer时的绘图流程。此外,还介绍了图层、画布和Canvas的关系,以及saveLayerAlpha函数和相关Flag的含义。

在使用SurfaceView时,当调用SurfaceHolder.lockCanvas()函数时,也会创建Canvas对象,有关SurfaceView的知识可以参考第十章。

图层与画布


前面讲过Canvas的save()和restore()函数,除了这两个函数以外,还有其他一些函数用来保存和回复画布状态。

saveLayer()函数

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)

  • 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之前就用绿色画笔填充了背景,效果如下:

在这里插入图片描述

那么如果这个时候我们把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);

}

效果如下:

在这里插入图片描述

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

1、调用saveLayer的绘图流程:

在调用saveLayer()函数时,会生成一块全新的画布,这块画布的大小就是我们所指定的所要保存区域的大小。新生成的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值