PorterDuff.Mode之动态扫描图

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);
    }

展示下效果

源代码

猜你喜欢

转载自blog.csdn.net/u013795543/article/details/81415451