获得半透明Android导航栏的位置和可见性

时间:2016-01-18 21:55:11

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

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

我希望实现从KitKat开始支持的半透明系统(状态和导航)栏,同时确保主View内的UI元素不受其阻碍。

This answer显示如何获取这些栏的默认高度(横向模式下导航栏高度也为navigation_bar_height_landscape,垂直导航栏宽度为navigation_bar_width) 。但这些只是系统的默认大小,如果当前正在显示导航栏,则不包含任何信息,以及它是显示在屏幕的右边还是底边。

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

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

1 个答案:

答案 0 :(得分:2)

环顾一下,包括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版本,否则它应该有效。