感谢大神总结的zbar文章:android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)

还有大神的工程:android_zbar二维码扫描


前段时间用zxing做的二维码扫描,中间遇到一个头疼的问题的时候,ios同事说我用的zbar,当时只是查了查android也有,今天有时间看了看zbar

zbar跟zxing的比较:

1、扫描速度来说zbar貌似略胜一筹(没有进行过多的测试,下结论有点早)

2、集成时间来讲zbar也更快一些,除了jar,几个so库,java文件只有一个

3、zbar没有生成二维码功能

如果只做二维码扫描,zbar更简单省事儿一些


开头提到了笔者是通过上面大神的文章才开始了解zbar

zbar只有一个java文件,Viewfinder.java


看了代码之后感觉边框通过图片来加载有点死板,.9图片也可以 对于边框和四个角笔者更倾向于直接画出来,想zxing那样

import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.View;/** * 查找框 *  * @author niexiaoqiang */public class FinderView extends View {private static final long ANIMATION_DELAY = 100L;private Paint finderMaskPaint;private int measureedWidth;private int measureedHeight;/** * 手机的屏幕密度 */private static float density;/** * 四个绿色边角对应的长度 */private int ScreenRate;/** * 四个绿色边角对应的宽度 */private static final int CORNER_WIDTH = 5;/** * 边框颜色 */private int middleRectColor;private int maskColor;public FinderView(Context context) {super(context);init(context);}public FinderView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//canvas.drawRect(leftRect, finderMaskPaint);//canvas.drawRect(topRect, finderMaskPaint);//canvas.drawRect(rightRect, finderMaskPaint);//canvas.drawRect(bottomRect, finderMaskPaint);// 画框(此方法是通过图片画出 看起来比较死板,在此参照zxing画边方法)// zx_code_kuang.setBounds(middleRect);// zx_code_kuang.draw(canvas);// 获取屏幕的宽和高int width = canvas.getWidth();int height = canvas.getHeight();// 画出扫描框外面的阴影部分,共四个部分,扫描框的上面到屏幕上面,扫描框的下面到屏幕下面// 扫描框的左边面到屏幕左边,扫描框的右边到屏幕右边// Draw the exterior (i.e. outside the framing rect) darkenedfinderMaskPaint.setColor(maskColor);canvas.drawRect(0, 0, width, middleRect.top, finderMaskPaint);canvas.drawRect(0, middleRect.top, middleRect.left, middleRect.bottom + 1, finderMaskPaint);canvas.drawRect(middleRect.right + 1, middleRect.top, width, middleRect.bottom + 1,finderMaskPaint);canvas.drawRect(0, middleRect.bottom + 1, width, height, finderMaskPaint);/* * zxing 画扫描框边上的角,总共8个部分 */finderMaskPaint.setColor(Color.GREEN);canvas.drawRect(middleRect.left, middleRect.top, middleRect.left+ ScreenRate, middleRect.top + CORNER_WIDTH, finderMaskPaint);canvas.drawRect(middleRect.left, middleRect.top, middleRect.left+ CORNER_WIDTH, middleRect.top + ScreenRate, finderMaskPaint);canvas.drawRect(middleRect.right - ScreenRate, middleRect.top,middleRect.right, middleRect.top + CORNER_WIDTH,finderMaskPaint);canvas.drawRect(middleRect.right - CORNER_WIDTH, middleRect.top,middleRect.right, middleRect.top + ScreenRate, finderMaskPaint);canvas.drawRect(middleRect.left, middleRect.bottom - CORNER_WIDTH,middleRect.left + ScreenRate, middleRect.bottom,finderMaskPaint);canvas.drawRect(middleRect.left, middleRect.bottom - ScreenRate,middleRect.left + CORNER_WIDTH, middleRect.bottom,finderMaskPaint);canvas.drawRect(middleRect.right - ScreenRate, middleRect.bottom- CORNER_WIDTH, middleRect.right, middleRect.bottom,finderMaskPaint);canvas.drawRect(middleRect.right - CORNER_WIDTH, middleRect.bottom- ScreenRate, middleRect.right, middleRect.bottom,finderMaskPaint);if (lineRect.bottom < middleRect.bottom) {zx_code_line.setBounds(lineRect);lineRect.top = lineRect.top + lineHeight / 2;lineRect.bottom = lineRect.bottom + lineHeight / 2;} else {lineRect.set(middleRect);lineRect.bottom = lineRect.top + lineHeight;zx_code_line.setBounds(lineRect);}zx_code_line.draw(canvas);postInvalidateDelayed(ANIMATION_DELAY, middleRect.left, middleRect.top,middleRect.right, middleRect.bottom);}private Rect topRect = new Rect();private Rect bottomRect = new Rect();private Rect rightRect = new Rect();private Rect leftRect = new Rect();private Rect middleRect = new Rect();private Rect lineRect = new Rect();private Drawable zx_code_kuang;private Drawable zx_code_line;private int lineHeight;private void init(Context context) {int finder_mask = context.getResources().getColor(R.color.finder_mask);finderMaskPaint = new Paint();finderMaskPaint.setColor(finder_mask);zx_code_kuang = context.getResources().getDrawable(R.drawable.zx_code_kuang);zx_code_line = context.getResources().getDrawable(R.drawable.zx_code_line);lineHeight = 30;// 获取屏幕密度density = context.getResources().getDisplayMetrics().density;// 计算当前屏幕密度下边框的厚度ScreenRate = (int) (15 * density);// 获取边框颜色资源middleRectColor = context.getResources().getColor(R.color.viewfinder_frame);maskColor = context.getResources().getColor(R.color.viewfinder_mask);}// ////////////新增该方法///////////////////////** * 根据图片size求出矩形框在图片所在位置,tip:相机旋转90度以后,拍摄的图片是横着的,所有传递参数时,做了交换 *  * @param w * @param h * @return */public Rect getScanImageRect(int w, int h) {// 先求出实际矩形Rect rect = new Rect();rect.left = middleRect.left;rect.right = middleRect.right;float temp = h / (float) measureedHeight;rect.top = (int) (middleRect.top * temp);rect.bottom = (int) (middleRect.bottom * temp);return rect;}// //////////////////////////////////@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);measureedWidth = MeasureSpec.getSize(widthMeasureSpec);measureedHeight = MeasureSpec.getSize(heightMeasureSpec);int borderWidth = measureedWidth / 2 + 100;middleRect.set((measureedWidth - borderWidth) / 2,(measureedHeight - borderWidth) / 2,(measureedWidth - borderWidth) / 2 + borderWidth,(measureedHeight - borderWidth) / 2 + borderWidth);lineRect.set(middleRect);lineRect.bottom = lineRect.top + lineHeight;leftRect.set(0, middleRect.top, middleRect.left, middleRect.bottom);topRect.set(0, 0, measureedWidth, middleRect.top);rightRect.set(middleRect.right, middleRect.top, measureedWidth,middleRect.bottom);bottomRect.set(0, middleRect.bottom, measureedWidth, measureedHeight);}}


大喊一声:开源万岁!

更多相关文章

  1. Android周学习Step By Step(7)--Activity简介
  2. Android获取屏幕分辨率及DisplayMetrics简介
  3. 关于Android的多种屏幕适配
  4. Android(安卓)中,应用程序需要的图片资源如何针对不同屏幕大小手
  5. Android屏幕属性应用
  6. android屏幕旋转在framework中的修改。
  7. 安卓屏幕适配
  8. android 中让activity全屏幕显示
  9. android获取屏幕高和宽

随机推荐

  1. Android事件分发机制和一些疑问
  2. Android View坐标getLeft, getRight, get
  3. 安卓入门.RelativeLayout相对布局1
  4. android 开发中判断网络是否连接的代码
  5. android EditText 设置弹出数字输入法键
  6. android设置横屏代码
  7. Android(安卓)Studio 时间选择器创建
  8. Android事件分发机制完全解析(终极版二)
  9. Android真机调试 Android.Util.AndroidRu
  10. Android的EditText设置光标一直显示而不