Android 基于Zxing二维码扫描的光速实现

来源:互联网 发布:韩国人吃不起肉 知乎 编辑:程序博客网 时间:2024/05/22 14:27

Android 十分钟光速实现二维码扫描

前言

在项目中要使用到二维码的相关内容,我们第一时间想到的是使用大名鼎鼎的zxing或者ZBar开源框架:

github-zxing官方库的地址

github-ZBar官方库的地址

除了这两个有名的框架之外,还有@bingoogolapple大神的扫描库

github-BGAQRCode库

以及国外@dlazaro66大神的

github-QRCodeReaderView库

以上是非常不错的二维码扫描库,基本市场上app中的所有功能都被这些库涵盖了,但是个人还是觉得用他们的库有点麻烦(不可避免的会踩到一些坑,尤其是zxing…有时扫描效率是真的低…),于是花了点时间在@dlazaro66大神的QRCodeReaderView库做出了修改,

基于zxing的一个中文的二维码扫描库

GitHub传送门-QRCodeScannerView 点我!点我!

Demo示例:

二维码扫描

该库支持功能如下:

· 二维码解析
· 前/后置摄像头切换扫描
· 打开闪光灯
· 开启/停止二维码扫描功能
· 自定义扫描界面UI,轻松定制自己的扫描框、扫描背景、扫描线相关属性
· 获得扫描框的坐标Rect(判断所扫二维码是否在扫描框内等)

这些功能实现的gif图都在github的 README 中:

QRCodeScannerView-Android

和其他库相比的优势(个人觉得):

1.快速开发

该库暂时只支持「二维码扫描相关」和「二维码界面UI的绘制」功能,因此封装好供开发者使用的只有「QRCodeScannerView(二维码扫描和解析)」和「QRCoverView(扫描框、扫描线等)」两个java类,因此对于不复杂的需求,可以最快速忽略底层的源码,实现的二维码解析功能。

2.自定义UI和功能更简单

对于一般的需求,可以通过封装好的方法进行设置,对于相对复杂的需求(比如自定义UI、扫描线等),只需要打开对应的类,里面的代码都注释的清清楚楚,摆脱zxing庞大的代码量(zxing实在太强大了,但是很多功能也许用不到,学习成本更高),可以更直观修改并实现需求:

以二维码UI(扫描线等)界面代码为例:

 private final Paint laserPaint = new Paint();   //扫描线Paint private boolean showLaser = true;      //是否显示扫描线 private float laserStartH = 0f;        //扫描线初始位置 private int laserChangeBounds = 30;    //渐变线的默认高度,默认30px private int laserChangeTime = 40;      //UI刷新间隔 private QRHandler handler; //扫描框的宽和高 private float scannerW; private float scannerH; //扫描框的上边距和左边距 private float top; private float left; //扫描边框的长度和厚度 private float cornerH; private float cornerW; private Context context; //扫描边框是否包裹扫描框 private boolean isCornerOutside = false; //扫描框的Rect private RectF viewFinderRect;    ...    ...    ... //绘制背景色 public void drawScanBackground(canvas, viewFinderRect); //绘制扫描边框 public void drawScanCorner(canvas, viewFinderRect); //绘制扫描线 public void drawLaserLine(canvas, viewFinderRect);

一、依赖和使用

1.添加到你的 Project Build.gradle:

allprojects {  repositories {    ...    maven { url 'https://jitpack.io' }  }}

2.添加到你的 Module Build.gradle:

dependencies {    compile 'com.github.qingmei2:QrCodeScannerView-Android:1.1'    compile 'com.google.zxing:core:3.2.1'}

3.直接在你的布局文件xml中使用

QRCodeScannerView(二维码扫描业务层View,主要处理Camera扫描二维码相关逻辑)

QRCoverView(二维码扫描UI层View,主要负责对应UI的改变,比如扫描框大小,背景颜色,扫描框边角大小颜色等等):

 <FrameLayout        android:id="@+id/fl_container"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1">        <com.mei_husky.library.view.QRCodeScannerView            android:id="@+id/scanner_view"            android:layout_width="match_parent"            android:layout_height="match_parent" />        <com.mei_husky.library.view.QRCoverView            android:id="@+id/cover_view"            android:layout_width="match_parent"            android:layout_height="match_parent" /></FrameLayout>

4.在对应的Activity中的onCreate()中初始化配置:

//自动聚焦间隔2smScannerView.setAutofocusInterval(2000L);//闪光灯mScannerView.setTorchEnabled(true);//扫描结果监听处理mScannerView.setOnQRCodeReadListener(new QRCodeScannerView.OnQRCodeScannerListener() {    @Override    public void onDecodeFinish(String text, PointF[] points) {        Log.d("tag", "扫描结果 : " + text);     }});//相机权限监听mScannerView.setOnCheckCameraPermissionListener(new QRCodeScannerView.OnCheckCameraPermissionListener() {    @Override    public boolean onCheckCameraPermission() {        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)                == PackageManager.PERMISSION_GRANTED) {            return true;        } else {            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA);            return false;        }    }});//开启后置摄像头mScannerView.setBackCamera();

二、相关API(详细使用方法请参照Sample中代码)

1、QRCodeScannerView(Camera/二维码扫描解析相关)

1.打开二维码扫描开关,默认打开

setQRDecodingEnabled(boolean qrDecodingEnabled)

2.设置自动聚焦间隔,默认2s

setAutofocusInterval(long autofocusIntervalInMs);

3.二维码解析结果回调【需要开发者实现】

setOnQRCodeReadListener(OnQRCodeScannerListener onQRCodeScannerListener)

4.Camera权限监听回调(用于Android 6.0)【需要开发者实现】

setOnCheckCameraPermissionListener(OnCheckCameraPermissionListener listener)

5.设置Camera默认打开方向【需要开发者实现】

setFrontCamera()//前置摄像头setBackCamera() //后置摄像头

6.开始/停止扫描

startCamera() 建议放在ActivityonResume()方法中stopCamera()  建议放在ActivityonPause()方法中

7.「可选」切换前置/后置摄像头

switchCameraFace()

2、QRCoverView(UI相关)

1.设置扫描框背景颜色

setCoverViewOutsideColor(int colorRes) 

2.设置扫描框边角颜色

ssetCoverViewCornerColor(int colorRes)

3.设置扫描框边角宽高

 /**   * 设置扫描边框宽高   *   * @param cornerH 扫描边框的长度   * @param cornerW 扫描边框的厚度   * @param isDp    若为true则将传入的参数单位视为dp,false 则单位视为px   */  setCoverViewCorner(int cornerH, int cornerW, boolean isDp)

4.设置扫描框边角的位置

/** * 若调用该setCoverViewConnerFace(true),则扫描边框则会包裹扫描框显示在界面上; * 否则默认扫描边框内贴在扫描框内(大多数app默认都是该模式) * * @param isOutside */setCoverViewConnerFace(boolean isOutside)

5.设置扫描框的宽高(dp)

setCoverViewScanner(int width, int height)

6.获得扫描框的坐标Rect(判断所扫二维码是否在扫描框内等)

RectF getViewFinderRect()

7.「重要」如果有更多需求,建议阅读QRCoverView.java的源码,里面注释很清楚,一般的UI需求简单改几个成员变量的属性就能实现,下为部分源码及注释:

private final Paint laserPaint = new Paint();   //扫描线Paintprivate boolean showLaser = true;      //是否显示扫描线private float laserStartH = 0f;        //扫描线初始位置private int laserChangeBounds = 30;    //渐变线的默认高度,默认30pxprivate int laserChangeTime = 40;      //UI刷新间隔private QRHandler handler;//扫描框的宽和高private float scannerW;private float scannerH;//扫描框的上边距和左边距private float top;private float left;//扫描边框的长度和厚度private float cornerH;private float cornerW;private Context context;//扫描边框是否包裹扫描框private boolean isCornerOutside = false;//扫描框的Rectprivate RectF viewFinderRect;.........@Overrideprotected void onDraw(Canvas canvas) {    //默认扫描框为180dp    if (scannerW == 0f || scannerH == 0f) {        viewFinderRect = new RectF(left, top, left + ScannerDpUtils.dip2px(context, 180), top + ScannerDpUtils.dip2px(context, 180));    } else {        viewFinderRect = new RectF(left, top, left + scannerW, top + scannerH);    }    //绘制背景色    drawScanBackground(canvas, viewFinderRect);    //绘制扫描边框    drawScanCorner(canvas, viewFinderRect);    //绘制扫描线    drawLaserLine(canvas, viewFinderRect);}

最后当然还要再开一个传送门:

GitHub传送门-QRCodeScannerView

如果这个库对你的开发有所帮助,望请不吝star,如果遇到Bug或者建议,欢迎issue,我会第一时间进行回复,提前感谢,鞠躬!!!

阅读全文
0 0
原创粉丝点击