前言
Android P项目开发时,获取的屏幕高度存在误差,之前项目中获取的高度都是固定的,后面为了适配各种项目,改为了动态获取屏幕高宽。
记录于此,方便自己查阅。
好记性不如烂笔头
正文
Android 版本 : Android P
获取的屏幕高度错误
adb shell wm size
#打印的内容
Physical size: 1024x600
而代码中获取的
DisplayMetrics{density=1.0, width=1024, height=504, scaledDensity=1.0, xdpi=134.07, ydpi=133.684}
你会发现,少了96px。
分析问题
原因是底部导航的高度占用了96px
位置: /frameworks/base/core/res/res/values/config.xml
<!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height -->
<dimen name="navigation_bar_height_landscape">48dp</dimen>
<dimen name="navigation_bar_height_car_mode">96dp</dimen>
<dimen name="navigation_bar_height_landscape_car_ode">96dp</dimen>
至于具体分析,可以看引用的文章《[DisplayMetrics获取宽高不对]》,该文章的作者有对着分析。
PS: 存在导航栏在左边的,获取的宽度也存在不一致
解决问题
//配置一个默认的高宽
private static int screen_width = 1024;
private static int screen_height = 600;
public static void initSizeInfo(Activity activity) {
if (null == activity) {
Log.d(VideoApp.TAG, "initSizeInfo null;: ");
return;
}
DisplayMetrics dm = new DisplayMetrics();
//高版本的有底部导航,因此要获取真实的高宽,需要调用的方法不同。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
} else {
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
}
Log.d(VideoApp.TAG, "initSizeInfo : " + dm.toString());
screen_width = dm.widthPixels;
screen_height = dm.heightPixels;
return;
}
public static int getScreenWidth() {
return screen_width;
}
public static int getScreenHeight() {
return screen_height;
}
参考文章
- 《Android中DisplayMetrics类获取屏幕尺寸》
- 《DisplayMetrics获取宽高不对》
- 《getResources().getDisplayMetrics().heightPixels获取到的屏幕高度不对》
历史上的今天
暂无评论...
随机推荐
[代码]开启WiFi调试
前言开启WiFi调试有两种,一种是adb开启,二是app中代码开启。第一种是可以,但毕竟麻烦,这里我就不细说了,可以百度一下。下面是选择第二种方式。正文以下是开启WiFi debug的代码,这里记录一下,方便查阅。隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参...
[摘抄]Linux之find命令详解
前言find是个使用频率比较高的命令。常常用它在系统特定目录下,查找具有某种特征的文件。记录一下,方便自己查阅。正文命令的格式:find [-path……] -options [-print -exec -ok]path要查找的目录路~ 表示$HOME目录. 表示当前目录/ 表...
[NDK开发]Android JNI 开发之静态注册
前言简单记录一下,方便自己查阅。PS: Android jni开发主要依赖Android开发平台,sdk和ndk三个部分Android SDK : Version 31JAVA Sdk : java1.8NDK : android-ndk-r21d上面只是举个例...
Web网站置灰的几种方式代码
前言众所周知,一般有大事情,很多官方网站的首页就会置灰。对这个比较感兴趣,因此就查询了一下,发现设置全站置灰的方式很简单。记录一下,方便自己查阅。PS: 本文内容摘抄的,文末有原作者连接正文置灰涉及全屏置灰,另外一种是首屏置灰。下面记录一下置灰的代码。全屏置灰方式一亲测,有效。...
Kotlin之子类和子类型
前言简单记录下一下Kotlin中子类和子类型的相关知识,方便自己查阅。小结子类是继承的概念,如果B继承A,则B就是A的子类。如果需要使用类型A的变量时,可以使用类型B的变量来代替,则此时类型B就是A的子类型。在需要使用时,用子类去替代父类,此时子类就是父类的子类型。正文...
刘半农:叫我如何不想她
天上飘着些微云,地上吹着些微风。啊!微风吹动了我头发,教我如何不想她? 月光恋爱着海洋,海洋恋爱着月光。啊!这般蜜也似的银夜,教我如何不想她? 水面落花慢慢流,水底鱼儿慢慢游。啊!燕子你说些什么话?教我如何不想她? 枯树在冷风里摇。...