首先google官方ApiDemo中Graphics中Xfermode截图:
对于官方文档的xfermode我们只是看到两个类似层的图片其实和photoshop中的图层一样;一个是原始图层,另一个是遮罩层
//将绘制操作保存到新的图层(离屏缓存) canvas.saveLayer(0,0,300,300, null,Canvas.ALL_SAVE_FLAG); 方法: public int saveLayer(float left, float top, float right, float bottom, Paint paint, int saveFlags)下面开始上代码:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width=MeasureSpec.getSize(widthMeasureSpec); int height=MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(width,height); }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.GREEN);//设画布绿色 canvas.translate(20,20);//移动画布 // 原始图片 Bitmap src = BitmapFactory.decodeResource(getResources(), R.mipmap.cangcang); // 图片的遮罩 Bitmap mask=Bitmap.createBitmap(300, 300, src.getConfig()); Canvas cc=new Canvas(mask); cc.drawCircle(150,150,150,mPaint); /* * 离屏缓存 * Layer层的宽和高要设定好,不然会出现有些部位不再层里面,你的操作是不对这些部位起作用的 */ int sc = canvas.saveLayer(0,0,300,300, null, Canvas.ALL_SAVE_FLAG); // 先绘制dis目标图 canvas.drawBitmap(src, 0, 0, mPaint); // 设置混合模式 (只在源图像和目标图像相交的地方绘制目标图像) mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); // 再绘制src源图 canvas.drawBitmap(mask, 0, 0, mPaint); // 还原混合模式 mPaint.setXfermode(null); // 还原画布 canvas.restoreToCount(sc); }