浅谈画笔Xfermode

来源:互联网 发布:网络短剧排名 编辑:程序博客网 时间:2024/05/20 01:13

Xfermode

老实说,这个东西我查了很多很久,都没有具体翻译,不过国内有不少大神称呼其为混合模式,姑且这么称呼吧。
它主要作用是画布canvas绘画是两个目标之间的显示模式,如下图:
这里写图片描述
其中Dst你可以看做背景图
Src是你正在画的图
而上面那图显示了16种两张图片混合下显示的模式、

举个例子

比如SrcIn这个模式就非常常用,用这个模式可以制作圆形图片啊,圆角图片啊,
这里写图片描述

具体实现原理非常简单,其实就是三步
第一步:先在canvas画一个圆
第二步:将画笔的xfermode属性设置为srcin模式

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

第三步,在canvas画你要显示的图片
因为从上面那十六模式图我们可以看到,srcin模式就是只显示两个绘画图层重叠的那个部分,所以因为你第一个图层是一个圆,所以你第二次画上去的虽然是一张方形的图片,但是因为叠加部分才能显示,所以一样显示的只能是圆形

其他模式一样道理,
用不同模式,可以做出各种酷炫效果,比如
loading》》》
这里写图片描述

比如,圆形的环:
这里写图片描述

具体代码如下:

public Bitmap getRound(){        Bitmap b=Bitmap.createBitmap(400,400, Bitmap.Config.ARGB_8888);        Canvas canvas=new Canvas(b);        Paint mp=new Paint();        mp.setColor(Color.RED);        canvas.drawCircle(200,200,200,mp);        mp.setColor(Color.BLUE);        mp.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));        canvas.drawCircle(200,200,100,mp);        return b;    }

这个可以得到一个圆形的环的bitmap,然后再在ondraw中将这个bitmap绘画出来,
必须这样,自己新建一个canvas,在这个新建canvas的bitmap上面绘画,然后导出新的bitmap才行,不然会发现直接画出来的图被隐藏部分变成了黑影,这是因为canvas挖去部分什么都没有了,所以是黑色的,但是导出bitmap的时候空不会被导出,所以黑色不会被导出,

当然,也可以用这样的方式在ondraw中直接使用xfermode

@Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        rectF.top=currentTop;        /**         * 设置View的离屏缓冲。在绘图的时候新建一个“层”,所有的操作都在该层而不会影响该层以外的图像         * 必须设置,否则设置的PorterDuffXfermode会无效,具体原因不明         */        int sc=canvas.saveLayer(0,0,totalW,totalH,paint,Canvas.ALL_SAVE_FLAG);        canvas.drawBitmap(bitmap,0,0,null);        paint.setXfermode(xfermode);        paint.setColor(Color.RED);        canvas.drawRect(rectF,paint);        paint.setXfermode(null);        /**         * 还原画布,与canvas.saveLayer配套使用         */        canvas.restoreToCount(sc);        if (currentTop>0){            currentTop--;            postInvalidate();        }    }
原创粉丝点击