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

为了让团队更方便使用,我将Zxing代码做了封装,做成了一个自定义View控件,并且生成了jar文件,可以在Android程序里直接引用。这个控件解决了不少网友询问的竖屏和横屏摆放的问题。

使用该控件很简单。首先要在项目目录下,建一个libs目录,将ZxingScanner.jar文件放进去。

然后建立项目引用,如下步骤:

1.通过Eclipse菜单Project->Properties->Java Build Path->Libraries,点击Add library;

2.选择User Library ,点击Next,点击User Library,点击New,输入随意的Library Name,比如ZxingScanner;

3.选择刚才创建的Library Name,点击Add JARs,找到libs目录下的ZxingScanner.jar,加入;

4.在Java Build Path的Libraries窗口中,就应该有这个带上了ZxingScanner.jar的library了。

因为扫描要用到相机,所以接着要设置AndroidManifest.xml,在里面加入使用相机的权限。

建议将控件放在一个横屏的Activity里,这样的话,由于扫描框的宽度大于高度,扫描条码时,可以将手机比较靠近条码。将Activity设为横屏大家都应该会了,但我还是附上代码吧,其实就是在AndroidManifest.xml的activity标签里加上下面这一句:

android:id="@+id/scanner_view"

android:layout_width="fill_parent"

android:layout_height="fill_parent"/>

这样,当activity打开时,会看到控件占据的区域内是相机影像,只要将中间的框对准条码,框中间的红线压住条码,就能识别。

别急,activity中还是要写一些代码的。

我定义的activity叫ZXingScannerActivity,它的作用是将控件识别的条码显示在一个TextView(txtResult)上。代码如下:

packagecom.covics.zxingscanner;

importandroid.app.Activity;

importandroid.graphics.Bitmap;

importandroid.os.Bundle;

importandroid.widget.TextView;

importandroid.widget.LinearLayout;

importandroid.widget.FrameLayout.LayoutParams;

importcom.covics.zxingscanner.ScannerView;

importcom.covics.zxingscanner.R;

//activity需要实现com.covics.zxingscanner.OnDecodeCompletionListener接口

publicclassZXingScannerActivityextendsActivityimplementsOnDecodeCompletionListener{

privateScannerView scannerView;

privateTextView txtResult;

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

scannerView=(ScannerView)findViewById(R.id.scanner_view);

txtResult = (TextView) findViewById(R.id.txtResult);

//条码扫描后回调自己的onDecodeCompletion

scannerView.setOnDecodeListener(this);

}

//将条码扫描识别结果打印在textview上,barcodeFormat是条码格式,barcode是条码内容,bitmap是条码图像

@Override

publicvoidonDecodeCompletion(String barcodeFormat,String barcode,Bitmap bitmap){

txtResult.setText("Barcode Format:"+barcodeFormat+"  Barcode:"+barcode);

}

@Override

protectedvoidonResume() {

super.onResume();

//onResume时才打开相机和闪光灯

scannerView.onResume();

}

@Override

protectedvoidonPause() {

super.onPause();

//onPause时关闭相机和闪光灯

scannerView.onPause();

}

@Override

protectedvoidonDestroy() {

super.onDestroy();

}

}

使用上就这么简单。

下面简单介绍一下ScannerView的实现原理。它扩展自FrameLayout,里面加入了一个SurfaceView和另一个扩展的View(ViewfinderView)。

SurfaceView用于显示相机的图像,通过将SurfaceView的surfaceholder传入相机对象,就能将相机的图像显示出来。

而ViewfinderView则是覆盖在SurfaceView上面,通过onDraw方法,画出中间一个框是全透明,其余区域是半透明的效果,让用户明白,通过中间全透明框取景。

扫描的原理:

CaptureActivityHandler 作为一个 handler,不断让相机自动对焦,并驱动相机获取preview图像,一旦获得preview图像,就传入给独立线程DecodeThread的 handler,有该handler负责将取景框部分的图像获取后,调用Zxing进行解码,如果解码成功,则通知ScannerView,将结果传给实现了OnDecodeCompletionListener接口的对象。

附件有两个内容:

1.ScannerView的项目源代码ZXingScanner

2.演示使用ScannerView的项目ZxingScanner Demo

android 条码扫描控件,Android Zxing条码扫描自定义控件(附代码)相关推荐

  1. android 自定义switch控件,Android中switch自定义样式

    android 原生开关按钮控件 Switch 提供样式自定义方式,可供我们修改为适合我们开发使用的样式控件,自定义样式过程如下: 自定义switch切换drawable 新建swith_thumb. ...

  2. android 自定义view控件,Android 自定义View——自定义View控件

    Android给我们提供了大量的View控件,但这还是远远满足不了我们的要求,有时候开发所需要的控件形式是在Android提供的控件中是不存在,这就需要我们自己去定义一个.那么如何自定义控件? 学习自 ...

  3. android studio 画控件,Android Studio 基础控件使用

    TextView android:gravity="center" //文字对其方式 top bottom left right center android:textColor= ...

  4. android 圆环温度控件,Android自定义View分享——一个圆形温度显示器

    写在前面 笔者近来在学习Android自定义View,收集了一些不算复杂但又"长得"还可以的自定义View效果实现,之前分享过一个水平的进度条,如果你有兴趣的话可以看看: Andr ...

  5. android基础ui控件,Android基础——基础UI控件

    日历,时钟,计时器 package com.example.mybaseuii; import androidx.appcompat.app.AppCompatActivity; import and ...

  6. android开发重要控件,Android界面编程——Android基本控件

    Android界面编程 Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户. 作为一个程序员 ...

  7. android 自定义刷新控件,Android开发中MJRefresh自定义刷新动画效果

    有时候我们对自己开发的项目经常不满意,但是我们要达到自定义刷新动画的效果有一定的难度,别着急,下面爱站技术频道和大家分享Android开发中MJRefresh自定义刷新动画效果,一起来学习吧! [一] ...

  8. android显示网络图片控件,Android控件之ImageView(二)

    前言 在上一篇文章中,我们讲解了如何加载本地图片,那么在实际项目中 ImageView 大多数使用场景是加载网络图片,网络图片其实就是存储在服务器上的文件,我们需要从服务器获取到文件的二进制输入流 I ...

  9. android studio开关控件,Android studio实现滑动开关

    大家好,今天刚学会使用Android Studio实现滑动开关的效果,自己感觉还可以,和大家分享一下,如果觉得可以的可以拿去,然后再给我点个赞,谢谢.本人也是学Android studiok开发不久, ...

最新文章

  1. eclipse中运行c++控制台没输出
  2. 对象创建方法,对象的内存分配,对象的访问定位
  3. 【五校联考7day2】QYQ的图
  4. navicat创建计算列_Tableau Part 9 计算字段amp;粒度聚合比率amp;表计算
  5. 缓存优化过程中的一些思考
  6. html框架里面怎么填写内容_还不会Python高级框架?进来,速学
  7. Ubuntu8.04系列二-系统优化篇
  8. 用汇编的眼光看C++(之 总结篇)
  9. 爱情智慧:从恋爱走向婚姻必备的理念
  10. WebSphere安装配置文档
  11. 44.android 简单的白天与夜晚模式切换
  12. win11家庭版如何彻底关闭病毒实时保护
  13. 基于springboot的手办定制销售系统毕业设计源码031800
  14. 统计学习方法第三章 k近邻法
  15. 数学建模竞赛【必须要掌握的十个算法】
  16. 如何理解Liveupdate Administrator (LUA) 下SEP的更新文件
  17. 有几种水果不能空腹吃,你知道吗?
  18. 2019-02-28 阴
  19. 计算机2 游戏攻略,史上最坑爹的游戏2全关卡游戏攻略大全
  20. 《深度学习进阶 自然语言处理》书籍介绍

热门文章

  1. 2022年,图机器学习Graph ML发展到哪了?
  2. 环形博弈 HDU - 3951
  3. 读书笔记——计算机组成原理
  4. Leetcode每日一题:50.powx-n
  5. Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)
  6. 最短路径 自己写的一个很简单的模板 dijkstra算法
  7. 花书+吴恩达深度学习(十六)序列模型之双向循环网络 BRNN 和深度循环网络 Deep RNN
  8. Vue-CLI 3.x 自动部署项目至服务器
  9. GitOps:Weaveworks通过开发者工具实现CI/CD
  10. Android NDK开发:打包so库及jar包供他人使用