SRC_IN
概念
保留覆盖目标图的源图,剩余的皆舍弃
原理
Dst为固定大小的圆,Src为获取的头像
原始实现
只会截取到固定的一小部分圆
@Overrid
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
int sc = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG);
Bitmap mDstB = drawDst(W,H);
canvas.drawBitmap(mDstB,0,0,mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Bitmap bm = Bitmap.decodeResource(getResources(),R.mipmap.zc);
canvas.drawBitmap(bm,0,0,mPaint);
mPaint.setxfermode(null)
canvas.restoreToCount(sc);
}
public Bitmap drawDst(int W,int H){
Bitmap bm = Bitmap.createBitmap(W,H, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bm);
mPaint.setColor(Color.BLACK);
canvas.drawCircle(W/2,H/2,W/2,mPaint);
return bm;
}
改进后
先对获取的Src进行处理后再绘制(实际应用中不介意,只是了解一下ProterDuffXfermode原理
getNewBitmap()
public Bitmap getNewBitmap(Bitmap bitmap,int newWidth,int newHeight){
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float scaleWidth = ((float) newWidth) /width;
float scaleHeight = ((float) newHeight) /height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth,scaleHeight);
Bitmap newBitmap = Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
return newBitmap;
}
onDraw()
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int sc = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG);
//对于Dst的处理不变
Bitmap mDstB = drawDst(W,H);
canvas.drawBitmap(mDstB,0,0,mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//将获取的图片再次进行处理后返回
Bitmap mSrcBitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.zc);
Bitmap bm = getNewBitmap(mSrcBitmap,W,H);
canvas.drawBitmap(bm,0,0,mPaint);
mPaint.setXfermode(null);
canvas.restoreToCount(sc);
}
DST_IN
概念
保留覆盖源像素的目标像素,丢弃剩余的源像素和目标像素
原理
与SRC_IN相反,将源图和目标图绘制顺序颠倒即可
即先处理图片,再在目标图上画圆
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int sc = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG);
Bitmap mDstB = drawDst(W,H);
Bitmap mSrcBitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.zc);
Bitmap bm = getNewBitmap(mSrcBitmap,W,H);
canvas.drawBitmap(bm,0,0,mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(mDstB,0,0,mPaint);
mPaint.setXfermode(null);
canvas.restoreToCount(sc);
}
效果
同上