感谢大神总结的zbar文章:android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)
还有大神的工程:android_zbar二维码扫描
前段时间用zxing做的二维码扫描,中间遇到一个头疼的问题的时候,ios同事说我用的zbar,当时只是查了查android也有,今天有时间看了看zbar
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); } @Override protected 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) darkened finderMaskPaint.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; } // ////////////////////////////////// @Override protected 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); } }