Android自定义View(三)过渡模式PorterDuffXfermode

1.PorterDuffXfermode

1.1 介绍

PorterDuffXfermode有点类似数学中的交集,并集,用来两个图像间的混合显示模式,设置的是两个图层交集区域的显示方式,dst是下层,先画的图形;src是上层,后画的图形。

1.2 构造方法

PorterDuffXfermode(PorterDuff.Mode mode);

构造方法中只需一个参数,PorterDuff.ModeModePorterDuff这个类中的一个枚举类,共有18个枚举值。

2. 18种模式

模式 效果
PorterDuff.Mode.CLEAR 上层绘制不会提交到画布,并把与下层交集部分也清除
PorterDuff.Mode.SRC 显示上层绘制,此时下层绘制也会显示
PorterDuff.Mode.DST 显示下层绘制,而上层不会绘制
PorterDuff.Mode.SRC_OVER 正常显示,上层叠盖在下层之上
PorterDuff.Mode.DST_OVER 上下层都显示,下层在上
PorterDuff.Mode.SRC_IN 将交集显示在下层绘制的区域
PorterDuff.Mode.DST_IN 显示下层绘制
PorterDuff.Mode.SRC_OUT 取非交集区域
PorterDuff.Mode.DST_OUT 取下层非交集区域
PorterDuff.Mode.SRC_ATOP 取上层的交集区域和下层的非交集区域
PorterDuff.Mode.DST_ATOP 下层在上层之上
PorterDuff.Mode.XOR 去除两层的交集区域
PorterDuff.Mode.DARKEN 取两层全部区域,交集区域变暗
PorterDuff.Mode.LIGHTEN 取两层全部区域,交集区域变亮
PorterDuff.Mode.MULTIPLY 取下层全部区域,交集区域色彩叠加,正片叠底
PorterDuff.Mode.SCREEN 取两层全部区域,交集区域变透明
PorterDuff.Mode.ADD 饱和度叠加
PorterDuff.Mode.OVERLAY 对黑白无效,显示两层颜色中和后的中间色

3.PorterDuff.Mode.CLEAR实践

1.先画一个黄色的圆

        paint.setColor(0xFFFFCC44);
        int r = width / 3;
        canvas.drawCircle(r,r,r,paint);

2.再画一个矩形,并设置PorterDuffXfermode为CLEAR

        paint.setColor(0xFF66AAFF);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        canvas.drawRect(r, r, r * 2.7f, r * 2.7f, paint);
        paint.setXfermode(null);

3. 一定要注意 ,一定要注意,一定要注意,此模式不支持硬件加速,需关闭

        setLayerType(View.LAYER_TYPE_SOFTWARE, null);

3. 简单圆形图片实践

1.先绘制下层圆形

canvas.drawCircle(getWidth() / 2,getHeight() / 2,Math.min(getWidth(),getHeight()) / 2,paint);

2.绘制图片,并设置过渡模式为:SRC_IN,将交集显示在下层绘制的区域

        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.img);
        canvas.drawBitmap(bitmap,0,0,paint);
        paint.setXfermode(null);

猜你喜欢

转载自blog.csdn.net/menglong0329/article/details/90173505