目录
目录效果展示
实现原理
首先将整个控件填充为黑色半透明,然后利用画笔的混合模式将中间需要放置身份证的区域清除掉即可。
代码实现
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);
//=============添加文字部分结束==================
}
}
网友评论