全面屏虚拟按键高度适配
需求场景:ScrollView中需要一个定高的recyclerView,其高度为屏幕高度,本以为一个简单的需求,调试了半天.
最初的高度获取
public static int getScreenHeight(Context context) {final Resources resources = context.getResources();final DisplayMetrics dm = resources.getDisplayMetrics();return dm.heightPixels;}
复制代码
测试结果(PS:测试机有限,欢迎更多人加入测试,发现未知的问题)
手机类型 | getScreenHeight() | getRealHeight() | 状态栏 | 虚拟按键 |
---|---|---|---|---|
Mi8虚拟按键模式 | 2120 | 2340 | 110 | 130 |
Mi8手势模式 | 2120 | 2340 | 110 | 130 |
华为Mate20虚拟按键模式 | 2094 | 2244 | 81 | 114 |
华为Mate20手势模式 | 2163 | 2244 | 81 | 114 |
vivo-z20虚拟按键模式 | 2154 | 2280 | 84 | 126 |
vivo-z20手势模式 | 2280 | 2280 | 84 | 126 |
由测试可以看出,getScreenHeight()获取的高度在各平台是不统一的,原因也各异:
- 理论上 getScreenHeight()获取的是可用高度,即屏幕整体高度减去占用的状态栏和虚拟按键.
- 小米不区分是否使用了虚拟按键.
- 华为,手势模式下正常,但虚拟按键模式高度有偏差.
- vivo,获取的高度多了状态栏高度.
而获取真实高度,状态栏高度,虚拟按键高度,可以获取一致的值,因此最终方案采用 真实高度- 状态栏高度- 虚拟按键高度来获取真实的可用高度(PS:由于现今绝大部分项目都不使用ActionBar,所以未考虑ActionBar的影响).
真实的可用高度获取(真实全屏高度- 状态栏高度- 虚拟按键高)
- 获取真实高度
public static int getRealHeight(Context context) {Display display = getDisplay(context);if (display == null) {return 0;}DisplayMetrics dm = new DisplayMetrics();display.getRealMetrics(dm);return dm.heightPixels;}
复制代码
- 状态栏高度
public static int getStatusHeight() {int height = 0;int resourceId = Latte.getApplicationContext().getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {height = Latte.getApplicationContext().getResources().getDimensionPixelSize(resourceId);}return height;}
复制代码
- 虚拟按键是否使用
- 检测是否是全面屏模式,如果是,不需考虑虚拟键
- 检测虚拟按键是否隐藏了
/*** 非全面屏下 虚拟按键是否打开** @param activity activity* @return 虚拟按键是否打开*/private static boolean isNavigationBarShown(Activity activity) {//虚拟键的view,为空或者不可见时是隐藏状态View view = activity.findViewById(android.R.id.navigationBarBackground);if (view == null) {return false;}int visible = view.getVisibility();if (visible == View.GONE || visible == View.INVISIBLE) {return false;} else {return true;}}/*** 全面屏(是否开启全面屏开关 0 关闭 1 开启)** @param context activity* @return 是否是前面屏*/private static boolean navigationGestureEnabled(Context context) {int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0);return val != 0;}复制代码
- 虚拟按键高度
private static int getNavigationBarHeight(Context context) {int result = 0;int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");if (resourceId > 0) {result = context.getResources().getDimensionPixelSize(resourceId);}return result;}
复制代码
- 可用高度 有了上面这些信息,即可获取真实的可用区域高度:
getScreenHeightReal(context) - getStatusHeight() - getNavigationBarHeightIfRoom(context)
工具类路径
相关知识(Display&&DisplayMetrics)
DisplayMetrics: 提供屏幕的通用信息,如显示大小,分辨率和字体
Display:提供逻辑显示区域大小、密度的相关信息
本次用的的方法
- context.getResources().getDisplayMetrics(): 包含可视区域的屏幕信息的DisplayMetrics;
- activity.getWindowManager().getDefaultDisplay(): 获取当前屏幕信息的 Display;
- display.getMetrics(DisplayMetrics outMetrics): 将dispay的可视区信息填入outMetics;
- display.getRealMetrics(DisplayMetrics outMetrics) :将dispay的真实区域(即完整屏幕区域)信息填入outMetics;
转载于:https://juejin.im/post/5cbeea1d5188250a9c355fbc
全面屏虚拟按键高度适配相关推荐
- android功能导航布局,Android全面屏虚拟导航栏适配
手机正朝着全面屏的方向演进,与此同时也给开发者带来了很多适配上的新问题,虚拟导航栏就是其中一个.最近在糗百的项目中,就有相关的适配问题,我查阅了目前关于虚拟导航栏适配的相关文章,基本上在全面屏手机里都 ...
- android 窗口导航,Android全面屏虚拟导航栏适配
手机正朝着全面屏的方向演进,与此同时也给开发者带来了很多适配上的新问题,虚拟导航栏就是其中一个.最近在糗百的项目中,就有相关的适配问题,我查阅了目前关于虚拟导航栏适配的相关文章,基本上在全面屏手机里都 ...
- Android 小米全面屏手势底部虚拟按键的适配
在项目的开发过程中,发现小米部分手机有一个全面屏手势功能,该功能可隐藏底部虚拟按键,通过手势的方式来实现返回和Home功能. 效果如下所示: 当开启全面屏手势的时候,就会存在一个问题,我们通过以下代码 ...
- react native 安卓(特别是小米手机)全面屏是否开虚拟按键的适配
react native 安卓(特别是小米手机)全面屏是否开虚拟按键的适配 做rn蛮久了,遇到的坑无数,谢谢大家带我爬过的坑,这次我也来分享一下,希望帮助到有需要的人! 大家先看先后效果对比: 没开虚 ...
- 获取屏幕大小、获取底部虚拟按键高度
转载请注明出处:获取屏幕大小.获取底部虚拟按键高度_getaccuratescreendpi_Mr_Leixiansheng的博客-CSDN博客 /** * 获取底部虚拟键盘的高度 */ public ...
- 全面屏虚拟键适配方案
写之前先吐槽下自己,工作了这么多年,终于能静下心来写博客了 最近公司有个需求,要实现类似于抖音的小视频全屏播放的样式,当虚拟键盘展示的时候,竖屏视频就撑满整个屏幕,当虚拟键盘隐藏的时候,就需要让视频底 ...
- android实现底部弹出框与软键盘冲突(全面屏虚拟键适配)
普通的底部弹出框大家都可以很熟练的使用了,无非是一个diaolog的事情,但是当dialog中含有输入框之后,软键盘与dialog的冲突可以说是十分坑了...更别说加上底部虚拟键了,这么一个小功能磨得 ...
- android底部滑动出现虚拟按键,Android适配底部虚拟按键的方法详解
Android适配底部虚拟按键的方法详解 发布时间:2020-10-09 05:26:12 来源:脚本之家 阅读:171 作者:yuanzhihui123 最近项目进行适配的时候发现部分(如华为手机) ...
- 黑鲨手机全面屏的导航栏适配
我在做黑鲨k3底部导航栏适配的时候,用了网上的一些通用的获取底部导航栏的方法是不行的,试了很多,最终找到了合适的方法,来判断是否存在底部导航 因为黑鲨的系统是基于miui,所以一些底层的设置用的是和小 ...
最新文章
- DIY最美数字女友!MIT开源最强虚拟人生成器,登Nature子刊
- [原]执行存储过程后返回影响的行数
- react的详细知识讲解!
- signalr网上学习资料
- Selenium + Grid + Testng并发运行用例
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
- 雷军:小米12 Pro全球首发索尼IMX707
- java 按照笔画排序_oracle 按照拼音、部首、笔画排序
- 企业管理器控制台本地无法访问
- Postfix上的反垃圾邮件的四个方法
- 接口--PCI/PCIE
- HTML引用另一个js文件的方法,在另一个js文件中调用一个javascript函数
- python爬取招聘网站视频教程_Python爬取拉钩招聘网
- 解决“the security certificate for this site has been revoked.the site should not be trusted.”
- java使用环信信息推送,环信推送详解
- 计算机巨人的采访对话英文怎么说,采访名人的英语对话
- 稳若磐石的「云上奥运」背后,是云计算新界面的崛起
- Hadoop项目结构及其主要作用
- android监控电话录音,Android例子源码实现电话录音监听的安卓例子
- 手动删除EMCC13C的 Repository Database
热门文章
- SYDTEK系列芯片低速PWM的三个模式和用法
- 蚂蚁CMS分类信息系统-蚂蚁CMS分类信息系统搭建配置教程
- powerdesigner数据库建模工具
- 2006年硬盘型号计算机,2006年硬盘综述之产品大全与选购建议
- 马克思资本论视角下的资本-记录
- PHP如何给整个内容填充背景,如何给文字添加背景图?给文字填充图片背景色的操作方法...
- 科学计算机怎么刷机,华为p1怎么刷机【图文教程】
- webstorm 常用快捷键大全归纳总结
- 安卓webrtc在ubuntu 2004下编译使用
- 销售和程序员哪个好_适合服装店的服装销售管理软件哪个好?