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() 建议放在Activity的onResume()方法中stopCamera() 建议放在Activity的onPause()方法中
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,我会第一时间进行回复,提前感谢,鞠躬!!!
- Android 基于Zxing二维码扫描的光速实现
- Android基于Zxing实现二维码,条形码扫描和生成二维码
- 基于zxing的二维码扫描
- Android 基于google Zxing实现二维码、条形码扫描
- Android基于Zxing实现扫描和生成二维码
- Android 基于google Zxing实现二维码、条形码扫描
- android基于ZXing和ZBar的二维码扫描项目
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- 高仿仿微信界面二维码扫描效果 之 Android 基于google Zxing实现二维码、条形码扫描
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android--基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- C#中数组、ArrayList和List三者的区别
- 洛谷 P1439 排列LCS问题
- LeetCode 97. Interleaving String
- HTML标签
- 最小生成树----Prim算法+loose操作
- Android 基于Zxing二维码扫描的光速实现
- 精讲 DispatchServlet源码解析(一)OnRefresh初始化
- linux信号阻塞与未决
- Lotus and Characters
- 垃圾回收
- 前端实时更新后端处理进度
- 20170524 React入门
- jdbc+mysql+ssh隧道
- 刷新界面 与 到指定界面