当前位置: 首页 > news >正文

全面屏手势导航栏适配

背景

识别是否全面屏手势场景,然后识别手势指示条是否显示,然后再获取指示条高度

由于全面屏手势是Android9开始出现的,所以验证需要从Android9的机型测到最新的15看时机效果。

是否全面屏手势判断

    public static boolean isGestureNavMode(Context context) {
        if (null == context) {
            return false;
        }
        if (Build.VERSION.SDK_INT >= 31) {
            int navMode = Settings.Secure.getInt(context.getContentResolver(), "hide_navigationbar_enable", 0);
            return navMode == 2 || navMode == 3;
        } else {
            return Settings.Secure.getInt(context.getContentResolver(), "navigation_mode", 0) == 2;
        }
    }

导航栏高度获取

public static int getNavBarHeightRes(Context context) {
        int navbarHeight = 0;
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
                if (resourceId > 0) {
                    navbarHeight = context.getResources().getDimensionPixelSize(resourceId);
                }
            } else {
                Class<?> clazz = Class.forName("com.android.internal.R$dimen");
                Object obj = clazz.newInstance();
                Field field = clazz.getField("navigation_bar_height");
                int height = Integer.parseInt(field.get(obj).toString());
                navbarHeight = context.getResources().getDimensionPixelSize(height);
            }
        } catch (Exception var5) {
            Log.w(TAG, "getNavBarHeightRes", var5);
        }
        Log.d(TAG, "navbarHeight=" + navbarHeight);
        return navbarHeight;
    }

通过onApplyWindowInsets监听当前的指示条的可见性

mRootLayout.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
                @Override
                public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                        boolean isNavBarVisible = insets.isVisible(WindowInsets.Type.navigationBars());
                        Log.d(TAG, isNavBarVisible + "  isNavBarVisible  ");
                    }
                    return insets;
                }
            });

是否显示状态栏(顺带mark)

这里的代码片段是在检查Activity的窗口是否设置了FLAG_KEEP_SCREEN_ON标志。
true:全屏,当前activity没有显示状态栏 false:有状态栏

int flag = activity.getWindow().getAttributes().flags;
boolean result = (flag & WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0;

相关文章:

  • 封装响应体、自定义异常、全局异常处理、工具类返回响应体
  • #渗透测试#批量漏洞挖掘#华测监测预警系统2.2 UserEdit.aspx SQL注入(CVE-2022-24876)
  • STM32--SPI通信讲解
  • 前缀和代码解析
  • Docker基础-常见命令
  • 库制作与原理
  • 《Python实战进阶》专栏 No 5:GraphQL vs RESTful API 对比与实现
  • 电路笔记(PCB):使用kicad进行滤波器的瞬态分析(时间响应分析)仿真
  • 03_pyqt5 + vlc 实现视频播放器
  • Deepseek-ClickHouse数据库的安全策略
  • 浪漫壁纸的元素构成及创作方向
  • linux usb 驱动 - configfs 文件系统
  • DistilQwen2.5发布:通义千问蒸馏小模型再升级
  • Grafana使用日志4--直接对接Zabbix数据库的一些注意点
  • DeepSeek-R1技术全解析:如何以十分之一成本实现OpenAI级性能?
  • FFmpeg.NET:.NET 平台上的音视频处理利器
  • PDF转HTML 超级好用 免费在线转换PDF 完美转换格式
  • [特殊字符]《封印adb的黑暗通道:让系统文件成为魔法禁书区的终极指南》[特殊字符]
  • DeepSeek 部署实战:Ollama + 多客户端 + RAG
  • 【数三角——枚举,哈希】
  • 九江网站设计服务机构哪家好/创建网站的流程
  • 网页设计图片怎么放进去/seo双标题软件
  • 朔城网站制作/sem推广托管公司
  • 北京工程信息网站/石家庄网络推广平台