Android学习

Paint.setXfermode

2019-03-16  本文已影响0人  偶是笨笨

前言

Xfermode

项目需要用到颜色混合模式的开发,查资料看到在绘图时有setXfermode()这个神奇的方法,没想到,在android Q时被废弃了,看了下新的API,几乎和之前的没有区别,那我们还是先来了解一下这个方法设计的一些知识吧。

了解

根据官网的提示,这个方法就是对模式的一个调用。而这个Xfermode是怎么生成的呢?

子类PoterDuffXfermode

最直接的子类PorterDuffXfermode。

Xfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)

这样你就可以调用setXfermode方法了。

重头-混合模式PorterDuff.Mode

目标文件Destination image

源文件Source image

两个图层文件

模式种类:(一共18种模式)

ADD CLEAR DARKEN DST DST_ATOP DST_IN DST_OUT DST_OVER LIGHTEN MULTIPLY OVERLAY SCREEN SRC SRC_ATOP SRC_IN SRC_OVER SRC_OUT XOP

实例展示

我需要用的就是SRC_IN,也就是显示覆盖的源图片区域,丢弃剩余的区域。

public class PorterDuffXfermodeView extends View {

    private Paint mPaint;

    private Bitmap dstBmp, srcBmp;

    private Xfermode mXfermode;

    public PorterDuffXfermodeView(Context context) {

        super(context);

        init();

    }

    public PorterDuffXfermodeView(Context context, @Nullable AttributeSet attrs) {

        super(context, attrs);

        init();

    }

    public PorterDuffXfermodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        init();

    }

    public void init() {

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);

        dstBmp = BitmapFactory.decodeResource(getResources(), R.mipmap.setting);

        srcBmp = BitmapFactory.decodeResource(getResources(), R.mipmap.red_package1);

        mXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);

    }

    @Override

    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);

        //背景色设为白色,方便比较效果

        canvas.drawColor(Color.WHITE);

        //将绘制操作保存到新的图层,因为图像合成是很昂贵的操作,将用到硬件加速,这里将图像合成的处理放到离屏缓存中进行

        RectF rectF = new RectF(0, 0, 1000, 1000);

        int saveCount = canvas.saveLayer(rectF, mPaint, Canvas.ALL_SAVE_FLAG);

        //绘制目标图

        RectF DErectF = new RectF(0, 0, 500, 500);

        canvas.drawBitmap(dstBmp, null, DErectF, mPaint);

        //设置混合模式

        mPaint.setXfermode(mXfermode);

        //绘制源图

        RectF RSrectF = new RectF(0, 0, 250, 500);

        canvas.drawBitmap(srcBmp,null, RSrectF, mPaint);

        //清除混合模式

        mPaint.setXfermode(null);

        //还原画布

        canvas.restoreToCount(saveCount);

    }

}

效果:

SRC_IN效果
上一篇 下一篇

猜你喜欢

热点阅读