android zbar二維碼掃描(中文不亂碼)

感謝大神總結的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);
	}

	@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);
	}
}


大喊一聲:開源萬歲!

發佈了62 篇原創文章 · 獲贊 5 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章