场景:扫一扫需求出现场景,非常规UI需求。发生在HD平板上。屏幕方向固定,非垂直,非横屏。竟让是反转横屏。
如图:
使用到的zxing库为开源:yipianfengye/android-zxingLibraryhttps://github.com/yipianfengye/android-zxingLibrary
遇到问题:1预览图变形,2,方向反转。3扫描不上。
一顿查找!!!各种解决变形问题。
起初就按照这种方式解决变形,然而代码无效。
感谢一位仁兄:https://blog.csdn.net/weimingyu1/article/details/52382182 Zxing横竖屏切换方法。
⬇️⬇️⬇️⬇️⬇️原文章加上自己的修改⬇️⬇️⬇️⬇️⬇️
Zxing横竖屏切换只需要修改
1、竖屏在DecodeHandler类中加上下面这段代码,横屏注释掉这段代码
//modify here 竖屏 /*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;*/ //横屏 不需要处理 //反转横屏(正常的竖屏转一下,再转一下就是反转横屏了。应该有一步转到的方式,下面代码 待优化。) /*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]; } byte[] dd = new byte[rotatedData.length]; for (int y = 0; y < width; y++) { for (int x = 0; x < height; x++) dd[x * width + width - y - 1] = rotatedData[x + y * height]; }*/ //上面不同屏幕方向,下面buildLuminanceSource 第一个参数 对应修改。
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);
2、然后修改CameraManager中的下面这段代码
# 竖屏为:
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;
# 横屏(包括反转横屏)为:
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;
3、修改AndroidManifest中的activity属性
android:screenOrientation="xxxxx"
portrait为竖屏,landscape为横屏,revertLandscape为反转横屏
4、最后修改CameraConfigurationManager类中的这行代码
setDisplayOrientation(camera, 90); //90为竖屏,0为横屏//modify here 0 横屏 竖屏 90 反转横屏; 180 camera.setDisplayOrientation(0);
----------------
至此 !屏幕旋转问题,解决了。预览图变形也好了。就是识别不上。
不解!各种郁闷!!!
最终布局文件在做祟!!有人说布局文件必须要那样吗!!!也怪我们的这需求有点不一样吧!!(如最上面图)
我将上图中的黑色区域放FrameLayout。
CaptureFragment替换于此。扫描没有任何反应。
为了解决这个问题。只能将在所有的布局 底下放一个全屏的FrameLayout,来放CaptureFragment。
可以扫描了!!!!!!!!!!!!!!!
问题又来了!!!!!!
外面的FrameLayout 和 Zxing的 ViewfinderView,位置不一致。
图上效果是调完之后,另外一种请款下出来的效果。
修改 ViewfinderView 中的
initInnerRect(Context context, AttributeSet attrs)方法。动态计算二维码区域宽高。 //左侧QR 适配 (下列数据供参考) //768 - 400 int widHei = 25 * screenHei / 48; // 扫描框的宽度 CameraManager.FRAME_WIDTH = widHei; // 扫描框的高度 CameraManager.FRAME_HEIGHT = widHei;
CameraManager
getFramingRect()修改位置。
//左边扫描部分 右边 放大镜 int rightHei = FRAME_WIDTH * 9 / 10; int rightWid = rightHei * 4 / 3; //剩余部分 25:11 int leftOffset = (screenResolution.x - FRAME_WIDTH - rightWid) * 25 / 36; int topTitleHei = DisplayUtil.dip2px(context, 86); int topOffset = (screenResolution.y - FRAME_HEIGHT - DisplayUtil.dip2px(context, 70) - topTitleHei) * 115 / (115 + 98) + topTitleHei; framingRect = new Rect(leftOffset, topOffset, leftOffset + FRAME_WIDTH, topOffset + FRAME_HEIGHT);
问题都解决了!!!
感谢博主:
1:https://blog.csdn.net/weimingyu1/article/details/52382182 Zxing横竖屏切换方法。
2:https://github.com/yipianfengye/android-zxingLibrar android-zxingLibrary