文章目录

  • 水滴屏适配解决方案:
  • 底部虚拟键盘NavigationBar适配方案:

水滴屏适配解决方案:

Android: smarxpan/NotchScreenTool:
https://github.com/smarxpan/NotchScreenTool

底部虚拟键盘NavigationBar适配方案:

这里是代码方式:

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;import java.lang.reflect.Method;public class NavigationBarInfo {/*** 导航栏竖屏高度标识位*/static final String IMMERSION_NAVIGATION_BAR_HEIGHT = "navigation_bar_height";/*** 导航栏宽度标识位位*/static final String IMMERSION_NAVIGATION_BAR_WIDTH = "navigation_bar_width";/*** MIUI导航栏显示隐藏标识位*/static final String IMMERSION_MIUI_NAVIGATION_BAR_HIDE_SHOW = "force_fsg_nav_bar";/*** EMUI导航栏显示隐藏标识位*/static final String IMMERSION_EMUI_NAVIGATION_BAR_HIDE_SHOW = "navigationbar_is_min";private static final String KEY_EMUI_VERSION_NAME = "ro.build.version.emui";public static int getNavigationBarHeight(Context context) {int result = 0;if (hasNavBar((Activity) context)) {return getInternalDimensionSize(context, IMMERSION_NAVIGATION_BAR_HEIGHT);}return result;}private int getNavigationBarWidth(Context context) {int result = 0;if (hasNavBar((Activity) context)) {return getInternalDimensionSize(context, IMMERSION_NAVIGATION_BAR_WIDTH);}return result;}/*** 判断是否为emui* Is emui boolean.** @return the boolean*/public static boolean isEMUI() {String property = getSystemProperty(KEY_EMUI_VERSION_NAME, "");return !TextUtils.isEmpty(property);}/*** 判断是否为emui3.1版本* Is emui 3 1 boolean.** @return the boolean*/public static boolean isEMUI3_1() {String property = getEMUIVersion();return "EmotionUI 3".equals(property) || property.contains("EmotionUI_3.1");}/*** 判断是否为emui3.0版本* Is emui 3 1 boolean.** @return the boolean*/public static boolean isEMUI3_0() {String property = getEMUIVersion();if (property.contains("EmotionUI_3.0")) {return true;}return false;}/*** 得到emui的版本* Gets emui version.** @return the emui version*/public static String getEMUIVersion() {return isEMUI() ? getSystemProperty(KEY_EMUI_VERSION_NAME, "") : "";}private static String getSystemProperty(String key, String defaultValue) {try {@SuppressLint("PrivateApi") Class<?> clz = Class.forName("android.os.SystemProperties");Method method = clz.getMethod("get", String.class, String.class);return (String) method.invoke(clz, key, defaultValue);} catch (Exception e) {e.printStackTrace();}return defaultValue;}/*** 判断是否为emui3.x版本* Is emui 3 x boolean.** @return the boolean*/public static boolean isEMUI3_x() {return isEMUI3_0() || isEMUI3_1();}private static boolean hasNavBar(Activity activity) {//判断小米手机是否开启了全面屏,开启了,直接返回falseif (Settings.Global.getInt(activity.getContentResolver(), IMMERSION_MIUI_NAVIGATION_BAR_HIDE_SHOW, 0) != 0) {return false;}//判断华为手机是否隐藏了导航栏,隐藏了,直接返回falseif (isEMUI()) {if (isEMUI3_x()) {if (Settings.System.getInt(activity.getContentResolver(), IMMERSION_EMUI_NAVIGATION_BAR_HIDE_SHOW, 0) != 0) {return false;}} else {if (Settings.Global.getInt(activity.getContentResolver(), IMMERSION_EMUI_NAVIGATION_BAR_HIDE_SHOW, 0) != 0) {return false;}}}//其他手机根据屏幕真实高度与显示高度是否相同来判断WindowManager windowManager = activity.getWindowManager();Display d = windowManager.getDefaultDisplay();DisplayMetrics realDisplayMetrics = new DisplayMetrics();d.getRealMetrics(realDisplayMetrics);int realHeight = realDisplayMetrics.heightPixels;int realWidth = realDisplayMetrics.widthPixels;DisplayMetrics displayMetrics = new DisplayMetrics();d.getMetrics(displayMetrics);int displayHeight = displayMetrics.heightPixels;int displayWidth = displayMetrics.widthPixels;return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;}private static int getInternalDimensionSize(Context context, String key) {int result = 0;try {int resourceId = Resources.getSystem().getIdentifier(key, "dimen", "android");if (resourceId > 0) {int sizeOne = context.getResources().getDimensionPixelSize(resourceId);int sizeTwo = Resources.getSystem().getDimensionPixelSize(resourceId);if (sizeTwo >= sizeOne) {return sizeTwo;} else {float densityOne = context.getResources().getDisplayMetrics().density;float densityTwo = Resources.getSystem().getDisplayMetrics().density;float f = sizeOne * densityTwo / densityOne;return (int) ((f >= 0) ? (f + 0.5f) : (f - 0.5f));}}} catch (Resources.NotFoundException ignored) {return 0;}return result;}
}

Android适配之水滴屏和虚拟按键相关推荐

  1. 关于Android适配华为等带有底部虚拟按键的解决方案

    关于Android适配华为等带有底部虚拟按键的解决方案 参考文章: (1)关于Android适配华为等带有底部虚拟按键的解决方案 (2)https://www.cnblogs.com/dhcn/p/7 ...

  2. android华为手机虚拟键,华为手机为何“固执”地保留屏内虚拟按键?答案揭秘!...

    本帖最后由 请称呼我所长 于 2017-9-5 00:33 编辑 0.jpg (39.44 KB, 下载次数: 158) 2017-9-3 15:12 上传 最in科技所,好玩的.新鲜的科技资讯都在这 ...

  3. 正面有Android手机常用的三枚虚拟按键

    中兴Geek手机采用了常规的直板式造型,正面有Android手机常用的三枚虚拟按键,完全采用金属材质打造的电源键.音量键以及一枚实体拍照键都被设计在手机右侧,左侧只设有数据接口.3.5mm耳机接口则被 ...

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

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

  5. Android常见公有方法(隐藏虚拟按键/隐藏软键盘/获取屏幕宽高等)

    隐藏虚拟按键,并且全屏 使用: ScreenUtils.hideBottomUIMenu(getWindow().getDecorView()); /*** 隐藏虚拟按键,并且全屏*/public s ...

  6. Android:解决华为手机隐藏虚拟按键Activity被重新创建的问题

    解决华为手机隐藏虚拟按键Activity被重新创建的问题 问题描述 解决方法 分析 问题描述 在华为手机P9上 屏幕底部虚拟按键用户可以随时隐藏或显示,在改变后 返回上一页,会导致页面重新创建,页面操 ...

  7. Android 适配底部返回键等虚拟键盘的完美解决方案

    这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...

  8. Android适配底部返回键等虚拟键盘的完美解决方案

    这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...

  9. android系统定制开发动态显示隐藏虚拟按键虚拟导航Navigationbar

    新需求:删除Android 原生自带的虚拟导航按键(暂定) 如想直接删除不显示Navigationbar,可以用如下两个方法 1)在资源xml文件中把导航按键的高度和宽度设置为0 frameworks ...

最新文章

  1. 智能算法的应用记录一点点-----TSP 路径规划
  2. 图论-最短路径--3、SPFA算法O(kE)
  3. 浅谈最小生成树的算法思路(二)Kruskal算法
  4. 洛谷P3414 SAC#1 - 组合数
  5. mysql 计算近30天总金额_MySQL数分实战:咖啡店精细化运营
  6. java 4种跟踪会话技术_会话跟踪技术
  7. SAP License:SAP系统的优点和功能
  8. Y15BeTa蜂鸣器-演奏版-简化版
  9. iOS 程序上传流程
  10. SpringBoot+SQLSERVER2000问题 简要总结
  11. 使用selenium下载百度图片
  12. VMWare ESXi thin磁盘空间回收,精简置备空间回收
  13. stc15单片机c语言 pdf,stc15单片机编程指南.pdf
  14. 计算机无法关闭密码保护,Windows 10不会关闭密码保护共享
  15. win10固态硬盘分区 整数_电脑硬盘分区大小多少才合理【详细介绍】
  16. 使用Keras 构建基于 LSTM 模型的故事生成器
  17. Spring事务报错Transaction synchronization is not active
  18. 什么是AP,什么是CP,什么是CAP?
  19. 2021-06-11警告: 多个不同应用注册了相同服务,请检查
  20. 常用集成电路功能简介 AD

热门文章

  1. 在VScode搭建Vue环境
  2. 论文解读HN-PPISP:一种基于MLP-Mixer的蛋白质-蛋白质相互作用位点预测混合网络
  3. 光学设计软件Ansys的Lumerical 2023版本下载与安装使用
  4. 在原先安装ubuntu桌面版系统的联想一体机安装win10系统
  5. HashMap的扩容方式
  6. x/nfu-用gdb查看内存
  7. 【Tableau 图表大全29】之棒棒图
  8. pve 不订阅更新_Steam又出奇葩新游!168小时内不冬眠就会死,5月5日开启抢先体验...
  9. 【动手学深度学习PyTorch版】23 深度学习硬件CPU 和 GPU
  10. 一加论坛签到3天积分换来的完整版壁纸合集