2016-01-18 76 views
0

我正在研究一個已移植到Android的跨平臺應用程序。由於其非Android遺產,它沒有廣泛使用Android UI元素 - 主應用程序窗口是一個單一的View獲取半透明Android導航欄的位置和可視性

我想實現半透明系統(狀態和導航),從KitKat開始支持,同時確保主要的View內的UI元素不被它們阻擋。

This answer演示瞭如何獲取這些條默認高度(也有navigation_bar_height_landscape在橫向模式下導航欄的高度,併爲navigation_bar_width垂直導航欄的寬度)。但是這些只是系統的默認尺寸,並且如果導航欄當前正在顯示,以及它是顯示在屏幕的右側還是下側,則不包含任何信息。

我發現的其他答案到目前爲止可能適用於非半透明系統欄:它們只是將總屏幕大小與主應用程序視圖的大小進行比較,區別在於系統欄所佔用的空間。但是,對於半透明系統條,尺寸差異爲零,並且此方法不起作用。

如何可靠地確定導航欄是否正在顯示以及在哪個位置?逛了一下

回答

1

展望,包括AOSP代碼this part,我想出了以下內容:

 // 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版本。