Xfermode的正确用法

时间:2023-02-04 16:18:49

xfermode的主要用途在于两张图片相互叠加的时候,其具体的叠加方式  如下图所示,相信用过的人都不会陌生,如果你没用过 ,可以百度一下 ,这样的教程有很多,这里就不细说了。。。 以下就是 src 图和 dst图  通过设置 xfermode的 模式得到的效果 ,但是我相信肯定有很多人在使用这个类来绘制的的时候是得不到想要的效果,或者和这个图的效果是有出入的。。。

下面我们就来看看 xfermode的正确使用姿态把


Xfermode的正确用法



一,我们来了解下 saveLayer() 方法 和 restoreToCount()方法  以及 save()和 restore();

很简单, save()和saveLayer()方法 是保存当前canvas的各种状态,比较平移,缩放 等等,并返回一个int  告诉你这是第几次保存的 ,值得一提的是 saveLayer()具有类似创建新图层的功能,可以自行了解详细;

而restore()则是恢复到最近save()的状态 , 而 restoreToCount()则是恢复到指定的 save()状态;


二,了解了上面的东西之后 ,我们就可以来使用xfermode了 时间有限, 接下来我们来看一段代码

然后我会在代码里面详细讲解;

@Override
protected void onDraw(Canvas canvas) {
/**
* 我们绘制一个圆形图片
*/
//第一步 我们直接saveLayer()拿到一个新的画布
//返回一个count值 在操作完之后 直接恢复到这个状态完成绘制
int count = canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG);
//直接在画布上画一个 drawable
Drawable drawable = ContextCompat.getDrawable(getContext(),R.mipmap.ic_launcher);
drawable.setBounds(0,0,getWidth(),getHeight());
drawable.draw(canvas);

//再次保存我们之前画的 drawable,并且此时需要传入一个带有 XferModepaint
//paint携带的xfermode模式将是之后判断我们两张图片叠加方式的的模式
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP));
canvas.saveLayer(0,0,getWidth(),getHeight(),paint,Canvas.ALL_SAVE_FLAG);

//画圆 也就是我们的第二个图
Paint paint2 = new Paint();
paint2.setColor(Color.RED);
canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2,paint2);

//操作完成 恢复到开始绘制的状态
canvas.restoreToCount(count);
}