安卓-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); }
安卓群英传里面的一个提示:在使用PorterDuffXfermode时还有一点需要注意,那就是最好在绘图时,将硬件加速关闭,因为有些模式并不支持硬件加速
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!