安卓-PorterDuffXfermode

一、当我们要实现两张图片之间的混合模式的时候经常会用到PorterDuffXfermode

二、使用方法

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

在mPaint调用setXfermode之前的对mPaint的draw称之为src,在setXfermode之后对mPaint的draw称之为dst

 

如上的代码设置的是DST_IN的模式,即使用dst的区域显示src的内容,还有其他模式可以看如下的显示,正方形是src,圆形是dst

三、刮刮乐的例子

刮刮乐手动涂抹的区域会显示出对应的背景内容,代码如下所示

    private Bitmap mBGBitmap;
    private Bitmap mFGBitmap;
    private Canvas mCanvas;
    private Paint mPaint;
    private Path mPath;
    private void init() {
        mBGBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test1);
        mFGBitmap = Bitmap.createBitmap(mBGBitmap.getWidth(), mBGBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mFGBitmap);
        mCanvas.drawColor(Color.GRAY); // 设置整体的画布颜色为灰色

        mPaint = new Paint();
        mPaint.setAlpha(0); // 将src设置为透明的
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); // DST_IN获取的是dst的绘制区域,src的绘制内容
        // 设置dst画实线的参数
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(50);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);

        mPath = new Path();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case ACTION_DOWN:
                mPath.reset();
                mPath.moveTo(event.getX(), event.getY());
                break;
            case ACTION_MOVE:
                mPath.lineTo(event.getX(), event.getY());
                break;
        }
        mCanvas.drawPath(mPath, mPaint); // 根据path和paint在画布上面绘制dst线,最终会绘制到mFGBitmap;
        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBGBitmap, 0, 0, null);
        canvas.drawBitmap(mFGBitmap, 0, 0, null);
    }
View Code

 

安卓群英传里面的一个提示:在使用PorterDuffXfermode时还有一点需要注意,那就是最好在绘图时,将硬件加速关闭,因为有些模式并不支持硬件加速

 

posted @ 2022-12-31 16:27  LCAC  阅读(166)  评论(0)    收藏  举报