Android——PorterDuffXfermode图形重叠处理模式
简介
PorterDuffXfermode事XFermode的子类。用于图形重叠处理。 可以使用PorterDuffXfermode实现圆形图片,圆角图片,橡皮擦效果,填充效果
上图:
16种模式分别对应:
PorterDuff.Mode.xxx :16个常量
注意点:图形重叠处理,处理源为src。 对该bitmap的paint进行设置,src代表自身,dst代表目标。
原理其实是:让srcBitmap的图层大到覆盖处理dst时,才会实现以上效果。
类:
PorterDuffXfermode
方法:
构造方法
PorterDuffXfermode(PorterDuff.Mode ProterDuff.Mode.xxx)
参数:
PorterDuff. Mode.xxx:16中模式之一
使用:
以Muliply为例子
public class MRoundImgView extends androidx.appcompat.widget.AppCompatImageView { private Bitmap dstImageViewBitMap; private Bitmap srcRoundRectBitMap; public MRoundImgView(Context context) { super(context); } public MRoundImgView(Context context, AttributeSet attrs) { super(context, attrs); } public MRoundImgView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 1.获取组件宽高 Drawable drawable = getDrawable(); int viewWidth = getWidth(); int viewHeight = getHeight(); // 2.设置画布背景颜色 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.parseColor("#ff0000")); paint.setStrokeWidth(10); paint.setColor(Color.parseColor("#ffffff")); canvas.drawRect(0,0,viewWidth,viewHeight,paint); // 3. 获取组件的bitmap dstImageViewBitMap = Bitmap.createBitmap(viewWidth,viewHeight,Bitmap.Config.ARGB_8888); Canvas dstCanvas = new Canvas(dstImageViewBitMap); drawable.draw(dstCanvas); // 4. 获取形状bitmap; srcRoundRectBitMap = Bitmap.createBitmap(viewWidth,viewHeight,Bitmap.Config.ARGB_8888); Canvas srcCanvas = new Canvas(srcRoundRectBitMap); srcCanvas.drawRoundRect(new RectF(0,0,viewWidth,viewHeight),50,50,paint); // 5.重置画布.画出两个bitmap int sc = canvas.saveLayer(0, 0, viewWidth, viewHeight, null, Canvas.ALL_SAVE_FLAG); canvas.drawBitmap(dstImageViewBitMap,0,0,paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas.drawBitmap(srcRoundRectBitMap ,0,0 , paint ); canvas.restoreToCount(sc); } }