在开发过程中,假如我们要从底部弹出一个popwindow,这时候我们需要考虑获取实际显示的虚拟键高度。

期望:

全面屏下

1.1 开启全面屏开关-返回0

1.2 关闭全面屏开关-执行非全面屏下处理方式

非全面屏下

2.1 没有虚拟键-返回0

2.2 虚拟键隐藏-返回0

2.3 虚拟键存在且未隐藏-返回虚拟键实际高度

/**

* 获取虚拟按键的高度

* 1. 全面屏下

* 1.1 开启全面屏开关-返回0

* 1.2 关闭全面屏开关-执行非全面屏下处理方式

* 2. 非全面屏下

* 2.1 没有虚拟键-返回0

* 2.1 虚拟键隐藏-返回0

* 2.2 虚拟键存在且未隐藏-返回虚拟键实际高度

*/

public static int getNavigationBarHeightIfRoom(Context context) {

if(navigationGestureEnabled(context)){

return 0;

}

return getCurrentNavigationBarHeight(((Activity) context));

}

/**

* 全面屏(是否开启全面屏开关 0 关闭 1 开启)

*

* @param context

* @return

*/

public static boolean navigationGestureEnabled(Context context) {

int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0);

return val != 0;

}

/**

* 获取设备信息(目前支持几大主流的全面屏手机,亲测华为、小米、oppo、魅族、vivo都可以)

*

* @return

*/

public static String getDeviceInfo() {

String brand = Build.BRAND;

if(TextUtils.isEmpty(brand)) return "navigationbar_is_min";

if (brand.equalsIgnoreCase("HUAWEI")) {

return "navigationbar_is_min";

} else if (brand.equalsIgnoreCase("XIAOMI")) {

return "force_fsg_nav_bar";

} else if (brand.equalsIgnoreCase("VIVO")) {

return "navigation_gesture_on";

} else if (brand.equalsIgnoreCase("OPPO")) {

return "navigation_gesture_on";

} else {

return "navigationbar_is_min";

}

}

/**

* 非全面屏下 虚拟键实际高度(隐藏后高度为0)

* @param activity

* @return

*/

public static int getCurrentNavigationBarHeight(Activity activity){

if(isNavigationBarShown(activity)){

return getNavigationBarHeight(activity);

} else{

return 0;

}

}

/**

* 非全面屏下 虚拟按键是否打开

* @param activity

* @return

*/

public 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;

}

}

/**

* 非全面屏下 虚拟键高度(无论是否隐藏)

* @param context

* @return

*/

public 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;

}```

android 虚拟键 高度,Android获取虚拟按键的高度(适配全面屏)相关推荐

  1. Android 系统(156)----Android APP适配全面屏手机的技术要点

    为了更好的阅读体验,可以转到我的个人站点:Windy'Journal 目录 目录 关于全面屏 更大的屏幕高宽比例 在AndroidManifest.xml声明max_aspect值 更换部分被拉伸的图 ...

  2. Android APP适配全面屏手机的技术要点-转载

    Android APP适配全面屏手机的技术要点  Windy_816 关注 2018.02.07 21:27* 字数 4010 阅读 5440评论 7喜欢 23 转载-来源 :https://www. ...

  3. Android APP适配全面屏手机的技术要点

    为了更好的阅读体验,可以转到我的个人站点:Windy'Journal 欢迎关注个人技术号:Android葵花宝典 获取最新的Android高级进阶知识点,以及Android逆向方法. 关于全面屏 全面 ...

  4. Android 浅谈适配全面屏、刘海屏、水滴屏

    对刘海屏.水滴屏做适配前,先在此给出一个基本概念:何谓刘海屏?何谓水滴屏? 上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖. 目前国内流行的手机厂商主要有:vivo ...

  5. Android适配全面屏,三星S8的18.9,小米mix全面屏

    一般手机的屏幕纵横比为16:9,如1080x1920.1440x2560等,其比值为1.777777--,全面屏手机出现之前,Android中默认的最大屏幕纵横比(maximum aspect rat ...

  6. Android适配全面屏

    Android适配全面屏 测试了很多方法,下面这个是我找到的可以用的 首先sdk的版本要在28及以上 然后使用代码 在setContentView之前插入代码 @Overrideprotected v ...

  7. android 适配全面屏手机

    什么是全面屏 全面屏跟曲面屏,这是两个不同的概念. 一般手机的屏幕纵横比为16:9,如1080x1920.1440x2560等,其比值为1.777777--,全面屏手机出现之前,Android中默认的 ...

  8. Android适配全面屏(华为荣耀8,小米8,三星S8等)

    昨天公司一运营小伙拿着新买的小米8,问我,为啥项目在我手机上下面有一大块是黑色的,原来,测试机一般用都是1920*1080的,或者是更小的,(16:9)的屏幕,而他的小米8是2160*1080(18: ...

  9. android8虚拟键布局,Android 虚拟按键在不同版本上的位置问题

    当 Android 手机设备进行横屏状态时,其虚拟按键的位置在不同版本上位置可能不同. 问题描述 应用里面为了实现全局的右滑返回效果而引入了一个 SwipeBack 库 (GitHub - Swipe ...

最新文章

  1. IBM SOA解决方案
  2. linux kernel的spin_lock的详细介绍(以arm64为例)
  3. (软件工程复习核心重点)第三章需求分析-第四节:其他图形工具
  4. leaflet-webpack 入门开发系列三地图分屏对比(附源码下载)
  5. 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表
  6. 虚拟空间 配置 服务器,虚拟主机空间可以修改服务器配置吗
  7. (一)Linux 常用命令
  8. Jersey 异常处理
  9. 计算机体系结构五大部分组成
  10. python远程文件管理系统_如何在Windows上使用Python访问远程文件系统?
  11. SSL自签名证书制作方法
  12. java环境64位_JAVA环境配置(WIN10之64位)
  13. SVS为某大学打造无纸化会议室
  14. Swagger怎么没有你要的model?一个注解帮你解决
  15. 闲聊人工智能产品经理(AIPM)—人工智能产品需求
  16. scanf可以输入负数吗_在excel表格中输入负数应该怎样输
  17. vue中实现文字间加空格的方法
  18. LintCode算法入门:
  19. TCP/IP卷二 mbuf
  20. Win10笔记本外接显示器调整分辨率教程

热门文章

  1. leet234.回文链表
  2. Anaconda 安装pkgs
  3. 正则表达式 String中正则匹配的方法
  4. 五种典型开发周期模型(瀑布、V、原型化、螺旋、迭代)
  5. 开启大功率无线充电新时代
  6. 无线网卡安装后显示无服务器,USB无线网卡安装后连接图标不显示怎么办【解决方法】...
  7. ForgivingExceptionHandler: An unexpected connection driver error occured (Exception message: Socket
  8. 002--软考程序员之硬件组成原理
  9. PHPMyWind5.4存储XSS(CVE-2017-12984)
  10. win7安装OpenCV:计算机中丢失opencv_world300d.dll