Paint.setXfermode
前言

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

最直接的子类PorterDuffXfermode。
Xfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
这样你就可以调用setXfermode方法了。
重头-混合模式PorterDuff.Mode
目标文件Destination image
源文件Source image

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


















实例展示
我需要用的就是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);
}
}
效果:
