需求场景: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;}
复制代码
  • 虚拟按键是否使用

    1. 检测是否是全面屏模式,如果是,不需考虑虚拟键
    2. 检测虚拟按键是否隐藏了
    /*** 非全面屏下 虚拟按键是否打开** @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

全面屏虚拟按键高度适配相关推荐

  1. android功能导航布局,Android全面屏虚拟导航栏适配

    手机正朝着全面屏的方向演进,与此同时也给开发者带来了很多适配上的新问题,虚拟导航栏就是其中一个.最近在糗百的项目中,就有相关的适配问题,我查阅了目前关于虚拟导航栏适配的相关文章,基本上在全面屏手机里都 ...

  2. android 窗口导航,Android全面屏虚拟导航栏适配

    手机正朝着全面屏的方向演进,与此同时也给开发者带来了很多适配上的新问题,虚拟导航栏就是其中一个.最近在糗百的项目中,就有相关的适配问题,我查阅了目前关于虚拟导航栏适配的相关文章,基本上在全面屏手机里都 ...

  3. Android 小米全面屏手势底部虚拟按键的适配

    在项目的开发过程中,发现小米部分手机有一个全面屏手势功能,该功能可隐藏底部虚拟按键,通过手势的方式来实现返回和Home功能. 效果如下所示: 当开启全面屏手势的时候,就会存在一个问题,我们通过以下代码 ...

  4. react native 安卓(特别是小米手机)全面屏是否开虚拟按键的适配

    react native 安卓(特别是小米手机)全面屏是否开虚拟按键的适配 做rn蛮久了,遇到的坑无数,谢谢大家带我爬过的坑,这次我也来分享一下,希望帮助到有需要的人! 大家先看先后效果对比: 没开虚 ...

  5. 获取屏幕大小、获取底部虚拟按键高度

    转载请注明出处:获取屏幕大小.获取底部虚拟按键高度_getaccuratescreendpi_Mr_Leixiansheng的博客-CSDN博客 /** * 获取底部虚拟键盘的高度 */ public ...

  6. 全面屏虚拟键适配方案

    写之前先吐槽下自己,工作了这么多年,终于能静下心来写博客了 最近公司有个需求,要实现类似于抖音的小视频全屏播放的样式,当虚拟键盘展示的时候,竖屏视频就撑满整个屏幕,当虚拟键盘隐藏的时候,就需要让视频底 ...

  7. android实现底部弹出框与软键盘冲突(全面屏虚拟键适配)

    普通的底部弹出框大家都可以很熟练的使用了,无非是一个diaolog的事情,但是当dialog中含有输入框之后,软键盘与dialog的冲突可以说是十分坑了...更别说加上底部虚拟键了,这么一个小功能磨得 ...

  8. android底部滑动出现虚拟按键,Android适配底部虚拟按键的方法详解

    Android适配底部虚拟按键的方法详解 发布时间:2020-10-09 05:26:12 来源:脚本之家 阅读:171 作者:yuanzhihui123 最近项目进行适配的时候发现部分(如华为手机) ...

  9. 黑鲨手机全面屏的导航栏适配

    我在做黑鲨k3底部导航栏适配的时候,用了网上的一些通用的获取底部导航栏的方法是不行的,试了很多,最终找到了合适的方法,来判断是否存在底部导航 因为黑鲨的系统是基于miui,所以一些底层的设置用的是和小 ...

最新文章

  1. DIY最美数字女友!MIT开源最强虚拟人生成器,登Nature子刊
  2. [原]执行存储过程后返回影响的行数
  3. react的详细知识讲解!
  4. signalr网上学习资料
  5. Selenium + Grid + Testng并发运行用例
  6. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
  7. 雷军:小米12 Pro全球首发索尼IMX707
  8. java 按照笔画排序_oracle 按照拼音、部首、笔画排序
  9. 企业管理器控制台本地无法访问
  10. Postfix上的反垃圾邮件的四个方法
  11. 接口--PCI/PCIE
  12. HTML引用另一个js文件的方法,在另一个js文件中调用一个javascript函数
  13. python爬取招聘网站视频教程_Python爬取拉钩招聘网
  14. 解决“the security certificate for this site has been revoked.the site should not be trusted.”
  15. java使用环信信息推送,环信推送详解
  16. 计算机巨人的采访对话英文怎么说,采访名人的英语对话
  17. 稳若磐石的「云上奥运」背后,是云计算新界面的崛起
  18. Hadoop项目结构及其主要作用
  19. android监控电话录音,Android例子源码实现电话录音监听的安卓例子
  20. 手动删除EMCC13C的 Repository Database

热门文章

  1. SYDTEK系列芯片低速PWM的三个模式和用法
  2. 蚂蚁CMS分类信息系统-蚂蚁CMS分类信息系统搭建配置教程
  3. powerdesigner数据库建模工具
  4. 2006年硬盘型号计算机,2006年硬盘综述之产品大全与选购建议
  5. 马克思资本论视角下的资本-记录
  6. PHP如何给整个内容填充背景,如何给文字添加背景图?给文字填充图片背景色的操作方法...
  7. 科学计算机怎么刷机,华为p1怎么刷机【图文教程】
  8. webstorm 常用快捷键大全归纳总结
  9. 安卓webrtc在ubuntu 2004下编译使用
  10. 销售和程序员哪个好_适合服装店的服装销售管理软件哪个好?