標籤:android 二維碼 效能 介面 尋找框
源碼下載
之前用zxing做開發,各種奇葩問題,橫屏修等等,而且效能也不搞。被測試批了,沒辦法後來換了zbar。效能好多了。
直接,看看效果
2.介面上的尋找框
/** * 2014-7-15 上午11:14:21 * Created By niexiaoqiang */package com.example.qu;import android.content.Context;import android.graphics.Canvas;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 = 30;private Paint finderMaskPaint;private int measureedWidth;private int measureedHeight;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);//畫框zx_code_kuang.setBounds(middleRect);zx_code_kuang.draw(canvas);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(Paint.ANTI_ALIAS_FLAG);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;}@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);}}
2.掃描的activity
package com.example.qu;import net.sourceforge.zbar.Config;import net.sourceforge.zbar.Image;import net.sourceforge.zbar.ImageScanner;import net.sourceforge.zbar.Symbol;import net.sourceforge.zbar.SymbolSet;import android.app.Activity;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.PreviewCallback;import android.hardware.Camera.Size;import android.os.AsyncTask;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;public class MainActivity extends Activity implements SurfaceHolder.Callback {private Camera mCamera;private SurfaceHolder mHolder;private SurfaceView surface_view;private ImageScanner scanner;private Handler autoFocusHandler;private AsyncDecode asyncDecode;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.ac_zbar_finder);init();}private void init() {surface_view = (SurfaceView) findViewById(R.id.surface_view);mHolder = surface_view.getHolder();mHolder.addCallback(this);scanner = new ImageScanner();scanner.setConfig(0, Config.X_DENSITY, 3);scanner.setConfig(0, Config.Y_DENSITY, 3);autoFocusHandler = new Handler();asyncDecode = new AsyncDecode();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {if (mHolder.getSurface() == null) {return;}try {mCamera.stopPreview();} catch (Exception e) {}try {mCamera.setDisplayOrientation(90);mCamera.setPreviewDisplay(mHolder);mCamera.setPreviewCallback(previewCallback);mCamera.startPreview();mCamera.autoFocus(autoFocusCallback);} catch (Exception e) {Log.d("DBG", "Error starting camera preview: " + e.getMessage());}}/** * 預覽資料 */PreviewCallback previewCallback = new PreviewCallback() {public void onPreviewFrame(byte[] data, Camera camera) {if (asyncDecode.isStoped()) {Camera.Parameters parameters = camera.getParameters();Size size = parameters.getPreviewSize();Image barcode = new Image(size.width, size.height, "Y800");barcode.setData(data);asyncDecode = new AsyncDecode();asyncDecode.execute(barcode);}}};private class AsyncDecode extends AsyncTask<Image, Void, Void> {private boolean stoped = true;@Overrideprotected Void doInBackground(Image... params) {stoped = false;Image barcode = params[0];int result = scanner.scanImage(barcode);if (result != 0) {//mCamera.setPreviewCallback(null);//mCamera.stopPreview();SymbolSet syms = scanner.getResults();System.out.println(syms);for (Symbol sym : syms) {Log.d("xiaoqiang", sym.getData());}}return null;}@Overrideprotected void onPostExecute(Void result) {super.onPostExecute(result);stoped = true;}public boolean isStoped() {return stoped;}}/** * 自動對焦回調 */AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {public void onAutoFocus(boolean success, Camera camera) {autoFocusHandler.postDelayed(doAutoFocus, 1000);}};//自動對焦private Runnable doAutoFocus = new Runnable() {public void run() {if (null == mCamera || null == autoFocusCallback) {return;}mCamera.autoFocus(autoFocusCallback);}};@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {mCamera = Camera.open();} catch (Exception e) {mCamera = null;}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (mCamera != null) {mCamera.setPreviewCallback(null);mCamera.release();mCamera = null;}}}