一、当我们要实现两张图片之间的混合模式的时候经常会用到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时还有一点需要注意,那就是最好在绘图时,将硬件加速关闭,因为有些模式并不支持硬件加速
标签:mPath,安卓,private,event,mPaint,PorterDuffXfermode,dst From: https://www.cnblogs.com/czwlinux/p/17016903.html