###一、概述

相信Adnroid开发都知道,世界上有四款扫描器,Zxing 、Zbar ,Barcode4J、OkapiBarcode 前二者应用较广泛,至于介绍与区别就在此阐述,网上有很多。此文主要介绍在在使用过程中,官方客户端各种达不到需求。相信很多童鞋都有此体会,所以借此机会就在Zxing 官方客户端基础上修改,去除无用功能并二次封装达到可扩展。

  • 官方客户端目前问题汇总
  • 设置功能多余
  • 竖屏后不能正向扫描条形码
  • 扫描框大小、颜色、扫描线配置不够灵活
  • 无生成二维码、主动识别二维码功能
  • 介于以上问题,于是该库就华丽的诞生
  • 修复竖屏不能正向扫描条形码
  • 可定制扫描框与扫描线样式
  • 加入创建二维码、识别图片中的二维码功能

###二、效果图

本库地址:https://github.com/mylhyl/Android-Zxing
###三、代码说明

  • Zxing 核心代码 https://github.com/zxing/zxing/tree/master/core 不作任何修改也不需要修改,只管用就行主要修改客户端代码。你可以自己编译成 jar 或者直接下源码拷到工程,可以参考Zxing编译。也可以到github下载本库,利用gradle编译
  1. 如下图双击 makeJar

  2. 等待控制出现 BUILD SUCCESSFUL 即编译完成,zxing 工程目录build将出libs目录

  • 精简后的代码,去掉资源文件、扫描历史记录、分享等,目录结构如下
  • camera 摄像头相关
  • common 全局静态常量相关
  • decode 解析二维码相关
  • encode 生成二维码相关
  • OnScannerCompletionListener 扫描成功接口
  • ViewfinderView 扫描预览视图
  • ScannerView 新增自定义View,包括 ViewfinderView 、SurfaceView,公开一些样式设置方法,具体使用后面介绍
  • 样式定义上来说,其实就在darw方法中,与平时自定义View一样,废话不多说来看一下干货

定义所用的变量

private int laserColor = Scanner.color.VIEWFINDER_LASER;//扫描线颜色
private int laserFrameBoundColor = laserColor;//扫描框4角颜色
private int laserLineTop;// 扫描线最顶端位置
private int laserLineHeight;//扫描线默认高度
private int laserMoveSpeed;// 扫描线默认移动距离px
private int laserFrameCornerWidth;//扫描框4角宽
private int laserFrameCornerLength;//扫描框4角高
private int laserLineResId;//扫描线图片资源
private String drawText = "将二维码放入框内,即可自动扫描";//提示文字
private int drawTextSize;//提示文字大小
private int drawTextColor = Color.WHITE;//提示文字颜色
private boolean drawTextGravityBottom = true;//提示文字位置
private int drawTextMargin;//提示文字与扫描框距离

darw方法

@Override
public void onDraw(Canvas canvas) {if (cameraManager == null) {return;}Rect frame = cameraManager.getFramingRect();//取扫描框//取屏幕预览Rect previewFrame = cameraManager.getFramingRectInPreview();if (frame == null || previewFrame == null) {return;}// 绘制扫描框以外4个区域drawMask(canvas, frame);// 如果有二维码结果的Bitmap,在扫取景框内绘制不透明的result Bitmapif (resultBitmap != null) {paint.setAlpha(CURRENT_POINT_OPACITY);canvas.drawBitmap(resultBitmap, null, frame, paint);} else {drawFrame(canvas, frame);//绘制扫描框drawFrameCorner(canvas, frame);//绘制扫描框4角drawText(canvas, frame);// 画扫描框下面的字drawLaserLine(canvas, frame);//绘制扫描线drawResultPoint(canvas, frame, previewFrame);//绘制扫描点标记moveLaserSpeed(frame);//计算移动位置}
}

扫描框的4个角

/*** 绘制扫描框4角** @param canvas* @param frame*/
private void drawFrameCorner(Canvas canvas, Rect frame) {paint.setColor(laserFrameBoundColor);paint.setStyle(Paint.Style.FILL);// 左上角canvas.drawRect(frame.left - laserFrameCornerWidth, frame.top, frame.left, frame.top+ laserFrameCornerLength, paint);canvas.drawRect(frame.left - laserFrameCornerWidth, frame.top - laserFrameCornerWidth, frame.left+ laserFrameCornerLength, frame.top, paint);// 右上角canvas.drawRect(frame.right, frame.top, frame.right + laserFrameCornerWidth,frame.top + laserFrameCornerLength, paint);canvas.drawRect(frame.right - laserFrameCornerLength, frame.top - laserFrameCornerWidth,frame.right + laserFrameCornerWidth, frame.top, paint);// 左下角canvas.drawRect(frame.left - laserFrameCornerWidth, frame.bottom - laserFrameCornerLength,frame.left, frame.bottom, paint);canvas.drawRect(frame.left - laserFrameCornerWidth, frame.bottom, frame.left+ laserFrameCornerLength, frame.bottom + laserFrameCornerWidth, paint);// 右下角canvas.drawRect(frame.right, frame.bottom - laserFrameCornerLength, frame.right+ laserFrameCornerWidth, frame.bottom, paint);canvas.drawRect(frame.right - laserFrameCornerLength, frame.bottom, frame.right+ laserFrameCornerWidth, frame.bottom + laserFrameCornerWidth, paint);
}

图片画与画笔扫描线

/*** 画扫描线** @param canvas* @param frame*/
private void drawLaserLine(Canvas canvas, Rect frame) {if (laserLineResId == 0) {paint.setStyle(Paint.Style.FILL);paint.setColor(laserColor);// 设置扫描线颜色canvas.drawRect(frame.left, laserLineTop, frame.right, laserLineTop + laserLineHeight, paint);} else {if (laserLineBitmap == null)//图片资源文件转为 BitmaplaserLineBitmap = BitmapFactory.decodeResource(getResources(), laserLineResId);int height = laserLineBitmap.getHeight();//取原图高//网格图片if (isLaserGridLine) {RectF dstRectF = new RectF(frame.left, frame.top, frame.right, laserLineTop);Rect srcRect = new Rect(0, (int) (height - dstRectF.height()), laserLineBitmap.getWidth(), height);canvas.drawBitmap(laserLineBitmap, srcRect, dstRectF, paint);}//线条图片else {//如果没有设置线条高度,则用图片原始高度if (laserLineHeight == Scanner.dp2px(getContext(), DEFAULT_LASER_LINE_HEIGHT)) {laserLineHeight = laserLineBitmap.getHeight() / 2;}Rect laserRect = new Rect(frame.left, laserLineTop, frame.right, laserLineTop + laserLineHeight);canvas.drawBitmap(laserLineBitmap, null, laserRect, paint);}}
}

扫描提示文字

/*** 绘制提示文字** @param canvas* @param frame*/
private void drawText(Canvas canvas, Rect frame) {int width = canvas.getWidth();paint.setColor(drawTextColor);paint.setTextSize(drawTextSize);final float textWidth = paint.measureText(drawText);//取出文字宽度float x = (width - textWidth) / 2;//文字开始位置//根据 drawTextGravityBottom 文字在扫描框上方还是下文,默认下方float y = drawTextGravityBottom ? frame.bottom + drawTextMargin : frame.top - drawTextMargin;canvas.drawText(drawText, x, y, paint);
}

###三、使用
直接在layout xml使用ScannerView即可

<com.mylhyl.zxing.scanner.ScannerViewandroid:id="@+id/scanner_view"android:layout_width="match_parent"android:layout_height="match_parent" />

重写onResume调用mScannerView.onResume();

@Override
protected void onResume() {mScannerView.onResume();super.onResume();
}

注册扫描成功监听器setOnScannerCompletionListener

/*** 扫描成功后将调用** @param rawResult    扫描结果* @param parsedResult 结果类型* @param barcode      扫描后的图像*/
void OnScannerCompletion(Result rawResult, ParsedResult parsedResult, Bitmap barcode);

调用如下方法获取类型

ParsedResultType type = parsedResult.getType();

可根据type强转为相应的对象,按项目需求处理。每个项目都有不同的需求,所以此库将最终处理结果丢给你们自己咯,想怎么玩就怎么玩,下面代码是在 sample 中

switch (type) {case ADDRESSBOOK:AddressBookParsedResult addressResult = (AddressBookParsedResult) parsedResult;bundle.putStringArray(Intents.AddressBookConnect.NAME, addressResult.getNames());bundle.putStringArray(Intents.AddressBookConnect.NUMBER, addressResult.getPhoneNumbers());bundle.putStringArray(Intents.AddressBookConnect.EMAIL, addressResult.getEmails());break;case URI:URIParsedResult uriParsedResult = (URIParsedResult) parsedResult;bundle.putString(Intents.URIContents.URI, uriParsedResult.getURI());break;case TEXT:bundle.putString(Intents.Scan.RESULT, rawResult.getText());break;
}

生成二维码

Bitmap bitmap = QREncode.encodeQR(MainActivity.this,new QREncode.Builder()                .setColor(getResources().getColor(R.color.colorPrimary))//二维码颜色.setParsedResultType(ParsedResultType.URI)//二维码类型.setContents("https://github.com/mylhyl")//二维码内容.build());
imageView.setImageBitmap(bitmap);

###四、样式设置

方法名 说明 默认值
toggleLight 切换闪光灯 关 false
setMediaResId 设置扫描完成播放声音
setLaserFrameBoundColor 扫描框4角颜色 绿色 0xff00ff00
setLaserFrameCornerLength 扫描框4角长度 15dp
setLaserFrameCornerWidth 扫描框4角宽度 2dp
setLaserColor 扫描线颜色 绿色 0xff00ff00
setLaserLineResId 条形扫描线图片资源
setLaserGridLineResId 网格扫描线资源
setLaserLineHeight 扫描线高度 2dp
setLaserFrameSize 设置扫描框大小 屏幕5/8
setLaserFrameTopMargin 设置扫描框与屏幕距离 屏幕5/8-状态
setDrawText text -> 内容
textSize -> 文字大小
textColor -> 文字颜色
isBottom -> 是否在扫描框下方
textMargin -> 离扫描框间距
text -> 将二维码放入框内,即可自动扫描
textSize -> 16sp
textColor -> 白色
isBottom -> true
textMargin -> 20dp

欢迎关注公众号,每天为您推送“人生感悟、说话技巧、职场规则、职场成长”

Android Zxing 扫描器 扫描框、扫描线定制样式相关推荐

  1. android 条码扫描控件,Android Zxing条码扫描自定义控件(附代码)

    团队要做一个项目,里面要用到条码扫描,搜了一下,知道了Zxing.这是一个开源的条码扫描程序.官方网站有完整的Android程序可下载.但是,如果想将扫描功能融合在自己开发的程序里,则需要理清设计的思 ...

  2. Android 系列 5.7使用Google ZXing条形码扫描器扫描条形码或QR码

    5.7使用Google ZXing条形码扫描器扫描条形码或QR码 问题 您希望应用程序能够扫描条形码或QR码("QR"原本代表"快速反应"). 解 使用Inte ...

  3. Android 系列 5 7使用Google ZXing条形码扫描器扫描条形码或QR码

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 5.7使 ...

  4. Android zxing,轻松实现二维码扫描、生成

    Android  zxing,轻松实现二维码扫描.生成 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有, ...

  5. Android ZXing 二维码、条形码扫描介绍

    最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目.它提供二维码和条形码的扫描.扫描条形码就是直接读取条形码的内容,扫描二维码是按照自己指 ...

  6. Android zxing 二维码扫描和生成方法(简单版)

    前言 二维码大家都见识过,这里就不废话了,直接来干货. 步骤 导入依赖 compile 'com.google.zxing:core:3.2.1' //zxing核心依赖compile 'com.jo ...

  7. Zxing 预览框不变增加扫描区域,仿微信扫到一半就可以成功

    最近公司提了个需求,要求项目里面的二维码扫描功能类似微信扫一扫功能,扫到4分之3左右就能成功扫出来.既然需求来了,那就搞呗,网上查了一堆资料,也没有找到具体的解决方案.那只能自己研究了,琢磨一下,既然 ...

  8. qcombox下拉框样式_ComboBox样式实例及下拉框的定制

    导读 组合框是一个重要且应用广泛的组件,一般由两个子组件组成:文本下拉单部分和按钮部分.在许多既需要用户选择.又需要用户手动输入的应用场景下,组合框能够很好的满足我们的需求.如我们经常使用的聊天软件Q ...

  9. Android 几种弹框样式 自定义Dialog PopupWindow的使用

    1.弹框的波浪线是动态的 和小度弹框样式相似 用到PopWindow 和自定义View . 2.这个弹框是动态的 用于网络加载时候  用到自定义Dialog 3.这就是一简单通用的弹框样式 第一种弹框 ...

最新文章

  1. windows 打开.ipynb文件
  2. (二)网络安全概论之云安全
  3. Scala模式匹配:对列表进行匹配
  4. Jmeter之事物控制器
  5. 拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?
  6. 多图文帖智能封面提取方案
  7. 数据结构 —— 在线操作与离线操作
  8. MSP430杂谈--IIC通信
  9. 报表开发之自定义函数
  10. 源头防堵信息泄露 监管拟全面推行支付标记化
  11. 企业级POS收银系统源码(客户端+后台)
  12. ENVI遥感图像监督分类与出图制作
  13. 深圳学位锁定怎么计算机,【实用】如何查询深圳房子学位是否锁定?(附操作步骤)...
  14. 进入bios看了,vt 已经开了,为什么打开模拟器还显示未开启?
  15. 证明:模n加法满足结合律
  16. 初学C语言(时间2022.11.7)
  17. 12.Numpy数值计算
  18. python strip()方法使用
  19. Encountered an improper argument.问题解决办法
  20. Cause: java.sql.SQLException: Parameter index out of range (4 > number of parameters, which is 3).

热门文章

  1. 使用Git工具上传项目代码到Gitee仓库
  2. linux内核中锁有哪些,Linux内核中有哪些锁
  3. spring boot 项目 事务 不能回滚 代理(not eligible for auto-proxying)
  4. Android Vold架构
  5. ValueError: attempt to get argmax of an empty sequence
  6. 科学计数法如何转换成普通的计数方式??
  7. C++ 简单的CPU使用率监控程序
  8. append()的用法
  9. js base64和图片 相互转换
  10. php 复制文件夹并压缩到最小_【实用】PHP实现下载与压缩文件的一些方法的封装与整理...