最近在学习 zxing ,发现了几篇不错的文章:
转载:
- zxing学习笔记(共六篇)
- zxing的逻辑梳理
- 直接接入zxing插件实现二维码扫描功能
- 如果要修改 ViewfinderView (扫描框)的大小,只要修改 CameraManager.java ,如下:
-
//修改扫描框的大小,本质是通过修改 getFramingRect() 中的 width和height //修改这四个常量值的大小来改变 getFramingRect()中的width和height private static final int MIN_FRAME_WIDTH = 400; private static final int MAX_FRAME_WIDTH = 580; private static final int MIN_FRAME_HEIGHT = 400; private static final int MAX_FRAME_HEIGHT = 500; //或者不用这几个值,自己定义width和height的大小 public Rect getFramingRect() { Point screenResolution = configManager.getScreenResolution(); if (framingRect == null) { if (camera == null) { return null; } // int width = screenResolution.x * 3 / 4; // if (width < MIN_FRAME_WIDTH) { // width = MIN_FRAME_WIDTH; // } else if (width > MAX_FRAME_WIDTH) { // width = MAX_FRAME_WIDTH; // } // int height = screenResolution.y * 3 / 4; // if (height < MIN_FRAME_HEIGHT) { // height = MIN_FRAME_HEIGHT; // } else if (height > MAX_FRAME_HEIGHT) { // height = MAX_FRAME_HEIGHT; // } int width = dip2px(200); int height = dip2px(200); int leftOffset = (screenResolution.x - width) / 2; int topOffset = (screenResolution.y - height) / 2; framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height); Log.d(TAG, "Calculated framing rect: " + framingRect); } return framingRect; } public int dip2px(float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); }
当使用 zxing 扫描二维码时,出现了近距离无法识别扫描出结果,必须距离很远才能识别的问题(放大识别区域也无效)。
解决方法:修改扫描距离,修改CameraConfigurationManager.java如下:(亲测有效)
void setDesiredCameraParameters(Camera camera) {
//注释掉该部分代码,替换成下面的
//Camera.Parameters parameters = camera.getParameters();
//Log.d(TAG, "Setting preview size: " + cameraResolution);
//parameters.setPreviewSize(cameraResolution.x, cameraResolution.y);
//setFlash(parameters);
//setZoom(parameters);
////setSharpness(parameters);
////modify here
//camera.setDisplayOrientation(90);
//camera.setParameters(parameters);
//替换如下
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
int position =0;
if(supportedPreviewSizes.size()>2){
position=supportedPreviewSizes.size()/2+1;
//supportedPreviewSizes.get();
} else{
position=supportedPreviewSizes.size()/2;
}
int width = supportedPreviewSizes.get(position).width;
int height = supportedPreviewSizes.get(position).height;
camera.setDisplayOrientation(90);
cameraResolution.x=width;
cameraResolution.y=height;
Log.d(TAG, "Setting preview size: " + cameraResolution);
parameters.setPreviewSize(width,height);
setFlash(parameters);
setZoom(parameters);
//setSharpness(parameters);
camera.setParameters(parameters);
}