zoukankan      html  css  js  c++  java
  • 修正Android基于ZXing的二维码扫描——横竖屏自由切换

    概述:

      此博客是基于开源的框架ZXing。ZXing用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。ZXing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。


    资源下载:

    http://download.csdn.net/detail/u013761665/8853561


    修改为竖屏显示:

    第1步:

    进入com.google.zxing.client.android包下的CaptureActivity类:

    注释以下代码:

    if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
                setRequestedOrientation(getCurrentOrientation());
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
            }

    第2步:

    进入com.google.zxing.client.android包下的DecodeHandler类:

    在代码

    PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
    上面添加:

    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 tmp = width; // Here we are swapping, that's the difference to #11
                width = height;
                height = tmp;
                data = rotatedData;


    第3步:

    进入com.google.zxing.client.android.camera包下的CameraConfigurationManager类:

    在Log.i(TAG, "Screen resolution: " + screenResolution)的下面添加:

    Point screenResolutionForCamera = new Point();
    screenResolutionForCamera.x = screenResolution.x;
    screenResolutionForCamera.y = screenResolution.y;
    if (screenResolution.x < screenResolution.y) {
        screenResolutionForCamera.x = screenResolution.y;
        screenResolutionForCamera.y = screenResolution.x;
    }
    cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolutionForCamera);
    


    第4步:

    进入com.google.zxing.client.android.camera包下的CameraConfigurationManager类:

    在代码camera.setParameters(parameters)的上面添加:

    camera.setDisplayOrientation(90);


    第5步:

    进入com.google.zxing.client.android.camera包下的CameraManager类:

    将代码:

    rect.left = rect.left * cameraResolution.x / screenResolution.x;
                    rect.right = rect.right * cameraResolution.x /
                    screenResolution.x;
                    rect.top = rect.top * cameraResolution.y / screenResolution.y;
                    rect.bottom = rect.bottom * cameraResolution.y /
                    screenResolution.y;
    替换成:

    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;


    横竖屏自由切换:

      上面的5步操作会让原本横屏扫描变为竖屏扫描。不过只能是一个方向上的。如果你想让用户可以在横屏和竖屏两种情况下都能使用的话,就要做一些必要的处理了。

      主要的思路就是,设置一个标志位Flag来标志当前的横竖屏状态。Flag是在扫描界面CaptureActivity的onResume的时候进行变换,并对外提供getter接口。不过在我的代码中还用到了一点就是使用EventBus框架来发布信息。


    横竖屏情况下的对比图:

    注:图中扫描的对象是其他的事物,要是对准了真实的二维码,那就可能截不到其扫描的屏幕了。本博客指在说明ZXing的横竖屏切换问题。



    竖屏



    横屏



  • 相关阅读:
    Python并行编程(七):线程同步之事件
    Python并行编程(六):线程同步之条件
    Python并行编程(五):线程同步之信号量
    Python并行编程(四):线程同步之RLock
    Python并行编程(三):线程同步之Lock
    UML关系总结——画uml图、流程图、软件结构图、类图、顺序图的方法
    2020,你好!
    字符串和多维数组
    排序算法
    查找技术
  • 原文地址:https://www.cnblogs.com/fengju/p/6336074.html
Copyright © 2011-2022 走看看