ZXING之前都用的好好的,结果在一个Android11的设备上翻了车 (基于全屏预览的情况下)

扫码页面预览效果变形,

在网上找了一些代码,修改后发现无效,不适用我这边的设备,

最后想着,预览结果变形,就是预览Size用的不太对,最后找到了调整预览Size的方法,修改了一下,经测试,Android 11 Android 7都正常显示

先全局搜索一下代码, findBestPreviewSizeValue 该方法是获取最佳预览Size的方法 

ZXING

private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) {
Point res = Util.getPoint(previewSizeValueString);
if (null != res) {
return res;
}
return null;
}

相关工具类方法

/**
* 获取最佳分辨率
*/
public static Point getPoint(CharSequence previewSizeValueString) {
Pattern COMMA_PATTERN = Pattern.compile(",");
String[] lists = COMMA_PATTERN.split(previewSizeValueString);
Size[] querys = new Size[lists.length];
int i = 0;
for (String data: lists ) {
String[] datas = data.split("x");
int width = Integer.parseInt(datas[1]);
int height = Integer.parseInt(datas[0]);
Size size = new Size(width,height);
querys[i] = size;
i++;
}
int width = Util.getScreenSize(context, true)[0];
int height = Util.getScreenSize(context, true)[1];
Size size = Util.chooseSize(querys,querys, width,height);
Point point = new Point(size.getHeight(), size.getWidth());
return point;
} /**
* 获取屏幕的宽高,(此方法来自于 autolayout)
*/
public static int[] getScreenSize(Context context, boolean useDeviceSize) {
int[] size = new int[2];
WindowManager w = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels; if (!useDeviceSize) {
size[0] = widthPixels;
size[1] = heightPixels - getStatusBarHeight(context); return size;
}
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
if (Build.VERSION.SDK_INT >= 17)
try {
Point realSize = new Point();
Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
widthPixels = realSize.x;
heightPixels = realSize.y;
} catch (Exception ignored) {
}
size[0] = widthPixels;
size[1] = heightPixels;
return size;
} /**
* 获取状态栏高度,(此方法来自于 autolayout)
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
try {
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
} catch (Resources.NotFoundException e) {
e.printStackTrace();
}
return result;
} /**
* Camera 获取合适的尺寸(如果有相同尺寸,优先选择)
*/
public static Size chooseSize(Size[] preChoices, Size[] picChoices, int width, int height) {
// Collect the supported resolutions that are at least as big as the preview Surface
List<Size> choices = new ArrayList<>();
// 部分设备 预览与拍照的分辨率不一致,故先获取一致的分辨率
for (Size pre: preChoices) {
for (Size pic: picChoices ) {
if (pre.getHeight() == pic.getHeight() && pre.getWidth() == pic.getWidth()) {
choices.add(pre);
}
}
}
if (choices.size() == 0) {
return preChoices[0];
}
int ReqTmpWidth = width;
int ReqTmpHeight = height;
//先查找preview中是否存在与surfaceview相同宽高的尺寸
for (Size size : choices) {
if ((size.getWidth() == ReqTmpWidth) && (size.getHeight() == ReqTmpHeight)) {
return size;
}
}
// 获取与传入的宽高比最接近的size
float reqRatio = ((float) ReqTmpWidth) / ReqTmpHeight;
float curRatio, deltaRatio;
float deltaRatioMin = Float.MAX_VALUE;
Size retSize = null;
for (Size size : choices) {
curRatio = ((float) size.getWidth()) / size.getHeight();
deltaRatio = Math.abs(reqRatio - curRatio);
if (deltaRatio < deltaRatioMin) {
deltaRatioMin = deltaRatio;
retSize = size;
}
}
return retSize != null ? retSize : choices.get(0);
}

ZXING 修复预览页面变形问题的更多相关文章

  1. android camera 摄像头预览画面变形

    问题:最近在处理一下camera的问题,发现在竖屏时预览图像会变形,而横屏时正常.但有的手机则是横竖屏都会变形. 结果:解决了预览变形的问题,同时支持前后摄像头,预览无变形,拍照生成的jpg照片方向正 ...

  2. vs2017/vs2019 去掉 单击aspx文件预览页面

    初次安装vs2017或者vs2019,新建的项目中,每次单击项目文件时,文件自动打开了 然后 打开 工具->选项->环境->选项卡和窗口->预览选项卡->勾掉" ...

  3. 12-tinyMCE文本编辑器+图片上传预览+页面倒计时自动跳转

    文本编辑器插件:1.将tinymce文件夹全部复制到webContent下2.tinymce/js目录下放 jquery等三个js文件3.语言包:tinymce/js/tinymce/langs目录下 ...

  4. VS Code 如何直接在浏览器中预览页面

    VS Code 预览html页面的时候,默认需要在资源管理器中显示,再在浏览器中预览.今天介绍一下如何直接预览html页面. 方法一:自己配置快捷键 1.ctrl + shift + p 或者 F1  ...

  5. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_24-页面预览-页面预览测试

    通过nginx转发到预览的地址 重启nginx 添加页面预览按钮 调整下列表的列的宽度

  6. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_23-页面预览-页面预览开发

    1.用户进入cms前端,点击“页面预览”在浏览器请求cms页面预览链接. 2.cms根据页面id查询DataUrl并远程请求DataUrl获取数据模型. 3.cms根据页面id查询页面模板内容 4.c ...

  7. github上怎么预览页面

    直接在 http://htmlpreview.github.io/? 后面加上git上的地址就可以预览了 比如 http://htmlpreview.github.io/?https://github ...

  8. Mark : Bootstrap fileInput控制预览页面上传、删除、详情按钮

    Bootstrap fileInput默认预览上传效果: 而我们可能想要的结果是: 这时候可以通过初始参数layoutTemplates来控制:

  9. 如何将Emmet安装到到 Sublime text 3?第二部分该插件还能让我们自定义快捷键呼出某个浏览器以预览页面

    看清楚哦~~这是Sublime text 3不是2的版本,两者的安装还是有区别的,下面的方法是我感觉比较简单的,其他的要命令什么的感觉太复杂了,经测试是OK的. 先关闭Sublime text 3: ...

  10. 微信小程序H5预览页面框架(二维码不隐藏)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

随机推荐

  1. Mac 完整卸载mysql

    依次执行 cd ~ sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems/M ...

  2. 全国DNS服务器IP大全

  3. AI生成前端组件的价值思考

    想法来源 这个想法来源于我自己的需求,我自己首先就是最精准的目标用户,在这个AI时代,我希望AI可以帮我尽量多地干活. 结合自己的日常独立开发情况,发现花在调前端组件样式上的时间很多,因此思考能不能让 ...

  4. AT_abc215_d 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\),\(M\) 及含有 \(N\) 个整数的序列 \(A\). 求 \( ...

  5. Windows/Linux 安装NVM及npm配置

    nvm安装及npm配置 nvm nvm下载 Windows: Releases · coreybutler/nvm-windows (github.com) Windows直接下载相应版本的nvm-s ...

  6. 关于写作那些事之快速上手Mermaid流程图

    本文主要介绍了如何快速上手 Mermaid 流程图,不用贴图上传也不用拖拉点拽绘制,基于源码实时渲染流程图,操作简单易上手,广泛被集成于主流编辑器,包括 markdown 写作环境. 通过本节内容你将 ...

  7. 阅读翻译Mathematics for Machine Learning之2.8 Affine Subspaces

    阅读翻译Mathematics for Machine Learning之2.8 Affine Subspaces 关于: 首次发表日期:2024-07-24 Mathematics for Mach ...

  8. whk随记

    金刚烷,实际上是p4把磷换成碳,然后在每两个碳之间再加一个碳,氢再补齐,由于碳都是sp3杂化,所以画出来并不对称,但实际上是对称的,一氯代物只有两种,像p4o6一样,而p4o10实际上是每个磷外面再连 ...

  9. scratch源码下载 | 飞天厨师

    程序说明: <飞天厨师>是一款使用Scratch平台制作的游戏程序.在这个游戏中,玩家将控制一名厨师角色,他在天空中不断掉落.玩家需要利用方向键左右移动厨师,以便他能够准确地踩在空中的食物 ...

  10. LangChain的LCEL和Runnable你搞懂了吗

    LangChain的LCEL估计行业内的朋友都听过,但是LCEL里的RunnablePassthrough.RunnableParallel.RunnableBranch.RunnableLambda ...