【问题标题】:Get position and visibility of translucent Android navigation bar获取半透明Android导航栏的位置和可见性
【发布时间】:2016-01-18 21:55:10
【问题描述】:

我正在开发一个已移植到 Android 的跨平台应用程序。由于其非 Android 传统,它没有大量使用 Android UI 元素 - 主应用程序窗口是一个 View

我想实现从 KitKat 开始支持的半透明系统(状态和导航)栏,同时确保主 View 内的 UI 元素不会被它们阻挡。

This answer 显示了如何获取这些栏的默认高度(还有navigation_bar_height_landscape 用于横向模式下的导航栏高度,navigation_bar_width 用于垂直导航栏的宽度)。但这些只是系统的默认尺寸,不包含当前是否显示导航栏以及显示在屏幕右侧还是底部边缘的信息。

到目前为止,我发现的其他答案可能适用于非半透明系统栏:它们只是将总屏幕大小与主应用程序视图的大小进行比较,不同之处在于系统栏占用的空间。但是,对于半透明系统栏,大小差异为零,这种方法不起作用。

如何可靠地确定导航栏是否正在显示以及显示在哪个位置?

【问题讨论】:

    标签: android user-interface android-4.4-kitkat


    【解决方案1】:

    环顾了一下,包括this part的AOSP代码,我想到了以下内容:

            // determine if navigation bar is going to be shown
            boolean isNavShowing;
            if (Build.VERSION.SDK_INT >= 13) {
                isNavShowing = ViewConfiguration.get(activity.getApplication()).hasPermanentMenuKey();
            }
    
            // determine where the navigation bar would be displayed
            boolean isNavAtBottom;
            if (Build.VERSION.SDK_INT >= 13) {
                isNavAtBottom = (activity.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
                        || (activity.getResources().getConfiguration().smallestScreenWidthDp >= 600);
            }
    

    然后您可以计算以下插图:

    • 左:0
    • 顶部:status_bar_height 的值
    • 右:0如果导航栏不在底部,否则navigation_bar_width
    • 底部:如果导航栏不在底部,则为 0,否则:如果方向为横向(参见上面的代码),navigation_bar_height_landscape;否则navigation_bar_height

    根据dimens.xml,默认值是:

    • status_bar_height: 24 dp
    • navigation_bar_height: 48 dp
    • navigation_bar_height_landscape: 48 dp
    • navigation_bar_width: 48 dp

    (如果您无法获得实际值,您可能希望退回到这些。)

    isNavShowing 的逻辑是我不久前实现的一个变体。即使在运行 CyanogenMod 的 OnePlusOne 上(用户可以通过设置在导航栏和硬件按钮之间切换),它也能可靠地检测到物理菜单按钮的存在。即使将软件菜单按钮添加到导航栏(这似乎是一个 CM 添加),仍然可以正确检测到导航栏。

    isNavAtBottom 的逻辑主要取自我上面链接的源文件中的 findNavigationBar() 函数,除非您使用高度定制的 Android 版本,否则应该可以工作。


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2021-09-27
      相关资源
      最近更新 更多