PorterDuff.Mode自android api1就引入了,主要是对两个图片进行交、并、异或等操作,主要有下列几种形式
本文利用SrcIn实现一个人脸扫描的效果,步骤如下:
1、准备两个人脸照片(一明一暗),暗照片作为背景,亮照片作为src前景显示
2、然后通过SrcIn用一个透明矩形框(Dst)与亮照片(src)取交集即可得出一个亮照片的局部区域
3、再给透明矩形一个上下的速度,即可达到扫描的效果
关键代码如下:
private void drawView() {
if (mHolder == null) {
return;
}
Canvas canvas = mHolder.lockCanvas();
if (canvas == null) {
return;
}
canvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR);
Bitmap bitmap=createPartBitMap();
canvas.drawBitmap(bitmap,0,0,paint);
canvas.drawColor(Color.parseColor("#80000000"));
paint.setColor(Color.parseColor("#475f70"));
paint.setStrokeWidth(1);
// 外围的圆形
canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2-30,paint);
paint.setColor(Color.parseColor("#4b9ac1"));
paint.setStrokeWidth(3);
//外围的旋转圆环
for (int i = 0; i < 3; i++) {
canvas.drawArc(6,6,getWidth()-6,getHeight()-6,i*120+angle,100,false,paint);
}
mHolder.unlockCanvasAndPost(canvas);
}
//利用PorterDuff.Mode.SRC_IN两图片取交集得到高亮区域
private Bitmap createPartBitMap() {
Paint paint = new Paint();
Bitmap target = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(target);
Rect rect=getLineRect(); //上下移动的矩形框
canvas.drawRect(rect,paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source,0,0,paint);
return target;
}
//移动的矩形框
private Rect getLineRect() {
angle+=5;
slideTop += SPEED_DISTANCE;
if (slideTop >= mRectBottom) {
//矩形达到人脸底部则从头计算
slideTop = mRectTop;
}
return new Rect(mRectLeft, slideTop, mRectRight, slideTop + lineHeight);
}
展示下效果