转载注明出处,否则小jj弹肿,什么?!没有?? 那...嘿嘿嘿~
https://blog.csdn.net/dazhang357/article/details/81559888
最近项目中要使用扫描二维码,于是乎就用到了 zxing-android-embedded 这个由zing库演变过来的android版的三方库,现在把使用心得以及过程进行分享~
话不多说,搞起!
第一步:导包和权限
权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 闪光灯不用就删 -->
<uses-permission android:name="android.permission.FLASHLIGHT" />
这里多说一句,我用的是api导包方式(一个小知识点):
api("com.journeyapps:zxing-android-embedded:3.6.0") {
exclude group: 'com.android.support'
}
肯定有朋友问了,为什么不用最常见的 implementation方式呢,好说,上面这种导入方式好处是,不会导致三方库的依赖包和项目本地的依赖包产生冲突,例如:com.android.support:appcompat-v7:28.0.0-beta01包,所以我建议各位以后导库都用上面的方式,一劳永逸,没懂?无所谓跟着做肯定没毛病,当然前提你的AS版本 >= 3.0的,要不然当我没说。
第二步:创建自定义ViewfinderView 类:
新建一个类 MyViewFinderView 继承 ViewfinderView 类,并重写它的两个方法:onDraw(Canvas canvas) 和 refreshSizes()方法。
onDraw(Canvas canvas) 里的内容去源码中copy即可,下面是我自己改的自定义样式代码:
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
refreshSizes();
if (framingRect == null || previewFramingRect == null) {
return;
}
final Rect frame = framingRect;
final Rect previewFrame = previewFramingRect;
final int width = canvas.getWidth();
final int height = canvas.getHeight();
// 注意此处如果不进行赋值,就会走下面的else方法,绘制图形。我比较懒,就直接引入了一个扫描边框图片。
resultBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.sc_bg);
paint.setColor(resultBitmap != null ? resultColor : maskColor);
canvas.drawRect(0, 0, width, frame.top, paint);
canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);
canvas.drawRect(0, frame.bottom + 1, width, height, paint);
// 此处是我自己写绘制的扫描线
drawScLine(liney, canvas);
if (resultBitmap != null) {
// Draw the opaque result bitmap over the scanning rectangle
paint.setAlpha(CURRENT_POINT_OPACITY);
canvas.drawBitmap(resultBitmap, null, frame, paint);
} else {
// Dra