美文网首页安卓UI三方Android专题
Android身份证识别(三)遮罩控件的实现

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

作者: itfitness | 来源:发表于2019-05-15 15:49 被阅读123次

    目录

    目录

    效果展示

    实现原理

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


    代码实现

    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

    相关文章

      网友评论

        本文标题:Android身份证识别(三)遮罩控件的实现

        本文链接:https://www.haomeiwen.com/subject/kcppaqtx.html