安卓-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 @   LCAC  阅读(155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示