您的位置:首页 > 移动开发 > Android开发

对Zxing修改实现二维码竖屏扫描

2015-10-22 22:43 363 查看
转载请标明出处:http://blog.csdn.net/rickyfm/article/details/49339473

描述

之前写了一篇文章介绍使用GitHub上的开源工程Zxing实现Android的二维码扫描,只是简单的将Zxing工程集成到自己的项目中单纯的实现二维码扫描的功能,而且是横屏的

之前在网上查过如何将横屏改为竖屏,很多解决方案都比较相似,但是由于版本的问题这些方法对Zxing3.2.0并不适用,我在这些基础之上做了一些改动最终实现了竖屏显示的效果,下面详细介绍一下具体的实现过程,希望对想要集成Zxing工程的开发者有帮助

先上图,最终的效果如下图所示:



修成竖屏显示的步骤

1、首先要修改CameraConfigurationManager类中的initFromCameraParameters()方法

/**
* Reads, one time, values from the camera that are needed by the app.
*/
void initFromCameraParameters(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point theScreenResolution = new Point();
display.getSize(theScreenResolution);
screenResolution = theScreenResolution;
Log.i(TAG, "Screen resolution: " + screenResolution);
//修改竖屏显示,解决图形拉伸问题
Point p = new Point();
p.x = this.screenResolution.x;
p.y = this.screenResolution.y;
if (this.screenResolution.x < this.screenResolution.y) {
p.x = this.screenResolution.y;
p.y = this.screenResolution.x;
}

cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, p);
Log.i(TAG, "Camera resolution: " + cameraResolution);
}
然后在setDesiredCameraParameters()方法中的camera.setParameters(parameters)之前加入以下代码:

camera.setDisplayOrientation(90);
2、修改CameraManager类中的getFramingRectInPreview()方法:

public synchronized Rect getFramingRectInPreview() {
if (framingRectInPreview == null) {
Rect framingRect = getFramingRect();
if (framingRect == null) {
return null;
}
Rect rect = new Rect(framingRect);
Point cameraResolution = configManager.getCameraResolution();
Point screenResolution = configManager.getScreenResolution();
if (cameraResolution == null || screenResolution == null) {
// Called early, before init even finished
return null;
}
//修改竖屏,扫描框尺寸的变换
rect.left = (rect.left * cameraResolution.y / screenResolution.x);
rect.right = (rect.right * cameraResolution.y / screenResolution.x);
rect.top = (rect.top * cameraResolution.x / screenResolution.y);
rect.bottom = (rect.bottom * cameraResolution.x / screenResolution.y);
framingRectInPreview = rect;
}
return framingRectInPreview;
}
3、修改DecodeHandler类中的decode()方法,在PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height)之前,在Result rawResult = null之后加入以下代码:
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[(x * height + height - y - 1)] = data[(x + y * width)];
}
int temp = width;
width = height;
height = temp;
data = rotatedData;
4、将AndroidManifest主配置文件的CaptureActivity显示改为竖屏显示
android:screenOrientation="portrait"
5、在CaptureActivity中将onResume()方法中的下面这段代码注释掉:

//    if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
//      setRequestedOrientation(getCurrentOrientation());
//    } else {
//      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
//    }
//
//    resetStatusView();
这段代码应该是后来的版本中添加的,这也是为什么时间稍早一点的解决横屏问题方案失效的重要原因,做完这些重新Run你的工程你会发现二维码的扫描以及变成竖屏了!大功告成!

修改扫描框样式

现在二维码扫描已经是竖屏的了,但是你可能会对扫描框的大小和样式不太满意,下面介绍如何修改扫描框的样式

1、修改CameraManager类中的getFramingRect()方法:

//修改扫描框尺寸
DisplayMetrics metrics = this.context.getResources().getDisplayMetrics();
int width = (int)(metrics.widthPixels * 0.9D);
int height = (int)(metrics.heightPixels * 0.6D);
这段代码是修改扫描框的长宽尺寸,可以根据自己的需要进行调整

2、在ViewfinderView类中对扫描框的外形加以修整,这里只是给扫描框加了四个角在onDraw()中添加以下代码:
//边框的四个角
this.paint.setColor(getResources().getColor(R.color.color_green));

canvas.drawRect(frame.left, frame.top, frame.left + 15, frame.top + 5, this.paint);
canvas.drawRect(frame.left, frame.top, frame.left + 5, frame.top + 15, this.paint);

canvas.drawRect(frame.right - 15, frame.top, frame.right, frame.top + 5, this.paint);
canvas.drawRect(frame.right - 5, frame.top, frame.right, frame.top + 15, this.paint);

canvas.drawRect(frame.left, frame.bottom - 5, frame.left + 15, frame.bottom, this.paint);
canvas.drawRect(frame.left, frame.bottom - 15, frame.left + 5, frame.bottom, this.paint);

canvas.drawRect(frame.right - 15, frame.bottom - 5, frame.right, frame.bottom, this.paint);
canvas.drawRect(frame.right - 5, frame.bottom - 15, frame.right, frame.bottom, this.paint);
同样你可以充分利用自己的审美在此方法中对扫描框加以修饰,目前的效果应该还可以了

精简工程代码

在这里简单介绍一下在集成Zxing工程后如何精简工程代码,大部分时候我们如果仅仅只使用二维码扫描的功能,那么Zxing中的一大半代码对我们来说是无用的,包括配置代码、资源文件等等,项目中每个类都有该类的功能性注释,根据注释来删减无用的类以及该类的引用,精简的过程比较繁复,有兴趣的和需要的读者可以去尝试一下,因为目前我对自己项目中使用的Zxing工程改动较大(一些类名方法名都做过改动),在此仅给出精简之前的实现了竖屏二维码扫描的源代码

点击此处下载源码

使用过程中如遇到什么问题欢迎交流

参考文章链接:http://blog.csdn.net/xinchen200/article/details/18036695
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息