对Zxing修改实现二维码竖屏扫描
2015-10-22 22:43
363 查看
转载请标明出处:http://blog.csdn.net/rickyfm/article/details/49339473
之前在网上查过如何将横屏改为竖屏,很多解决方案都比较相似,但是由于版本的问题这些方法对Zxing3.2.0并不适用,我在这些基础之上做了一些改动最终实现了竖屏显示的效果,下面详细介绍一下具体的实现过程,希望对想要集成Zxing工程的开发者有帮助
先上图,最终的效果如下图所示:
1、修改CameraManager类中的getFramingRect()方法:
2、在ViewfinderView类中对扫描框的外形加以修整,这里只是给扫描框加了四个角在onDraw()中添加以下代码:
点击此处下载源码
使用过程中如遇到什么问题欢迎交流
参考文章链接:http://blog.csdn.net/xinchen200/article/details/18036695
描述
之前写了一篇文章介绍使用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
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories