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);

    }
}

 

posted @ 2021-11-13 20:07  remix_alone  阅读(609)  评论(0)    收藏  举报