Android中Xfermode用法

首先google官方ApiDemo中Graphics中Xfermode截图:

Android中Xfermode用法_第1张图片

对于官方文档的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);
}

那么其他的xfermode属性大家可以自己尝试。前提是Layer的宽度和高度大家要控制好,其他都大同小异。

Xfermode

你可能感兴趣的:(Android中Xfermode用法)