安卓UI三方Android专题

Android身份证识别(三)遮罩控件的实现

2019-05-15  本文已影响123人  itfitness

目录

目录

效果展示

实现原理

首先将整个控件填充为黑色半透明,然后利用画笔的混合模式将中间需要放置身份证的区域清除掉即可。


代码实现

public class MaskView extends View {
    private Paint mPaint;
    private RectF mCardRectF;

    public MaskView(Context context) {
        this(context,null);
    }

    public MaskView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MaskView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setLayerType(LAYER_TYPE_SOFTWARE,null);//关闭硬件加速
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //由于身份证的长为85.6mm,身份证的宽为54mm因此我们可以得出身份证的长宽比
        float ratio = (float) (85.6 / 54);
        //这里我们设置显示身份证区域的宽为整个控件宽度的2/3
        float cardWidth = w / 3 * 2;
        //因此可以得出身份证区域的高度为
        float cardHeight = cardWidth * ratio;
        //接下来可以算出身份证区域的矩形位置为
        mCardRectF = new RectF((w - cardWidth) / 2, (h - cardHeight) / 2, w - (w - cardWidth) / 2, h - (h - cardHeight) / 2);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();//保存画布
        canvas.drawColor(Color.parseColor("#aa000000"));//填充黑色半透明
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));//设置混合模式为清除
        canvas.drawRect(mCardRectF,mPaint);
        mPaint.setXfermode(null);//清除混合模式
        canvas.restore();//恢复画布
    }
}

效果扩展

●添加文字
效果展示:


实现原理:

首先将画布的(0,0)点移至控件中心。

然后将画布顺时针旋转90度,此时整个画布的坐标值如上图所示,因此我们可以算出文字的位置的横坐标为0,纵坐标为-(身份证区域宽度/2)
代码实现:
public class MaskView extends View {
    private Paint mPaint;
    private Paint mPaint_Text;
    private RectF mCardRectF;
    private float mCardWidth;
    private float mCardHeight;
    //...省略部分代码

    private void init() {
       //...省略部分代码

        mPaint_Text = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint_Text.setTextSize(60);//文字大小
        mPaint_Text.setColor(Color.WHITE);//文字颜色
        mPaint_Text.setStrokeWidth(3);//文字的粗细
        mPaint_Text.setTextAlign(Paint.Align.CENTER);//文字的对其方式
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //由于身份证的长为85.6mm,身份证的宽为54mm因此我们可以得出身份证的长宽比
        float ratio = (float) (85.6 / 54);
        //这里我们设置显示身份证区域的宽为整个控件宽度的2/3
        mCardWidth = w / 3 * 2;
        //因此可以得出身份证区域的高度为
        mCardHeight = mCardWidth * ratio;
        //接下来可以算出身份证区域的矩形位置为
        mCardRectF = new RectF((w - mCardWidth) / 2, (h - mCardHeight) / 2, w - (w - mCardWidth) / 2, h - (h - mCardHeight) / 2);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //...省略部分代码
        //==============添加文字部分==================
        canvas.translate(getWidth()/2,getHeight()/2);
        canvas.rotate(90);
        canvas.drawText("请扫描本人身份证人像面",0,-mCardWidth/2-20,mPaint_Text);
        //=============添加文字部分结束==================
    }
}

本次案例源码:https://github.com/myml666/IdCardOcr01

上一篇 下一篇

猜你喜欢

热点阅读