2016-01-18 4 views
0

Я работаю над кросс-платформенным приложением, которое было перенесено на Android. Из-за своего наследия, отличного от Android, он не использует широкоформатные элементы Android UI - главное окно приложения - одно целое View.Получить положение и видимость полупрозрачной панели навигации Android

Я хотел бы реализовать полупрозрачную систему (состояние и навигацию), которые поддерживаются KitKat и далее, гарантируя, что элементы пользовательского интерфейса внутри основного View не будут перекрыты ими.

This answer показывает, как получить высоту по умолчанию для этих баров (есть также navigation_bar_height_landscape по высоте бара навигации в ландшафтном режиме, и navigation_bar_width для ширины вертикальной панели навигации). Но это только размеры по умолчанию для системы и не содержат информации, если в данный момент отображается панель навигации, и отображается ли она справа или внизу экрана.

Другие ответы, которые я нашел до сих пор, вероятно, отлично подходят для непрозрачных системных баров: они просто сравнивают общий размер экрана с размером основного вида приложения, а разница - это пространство, занимаемое системными барами. Однако с полупрозрачными системными полосами разность размеров равна нулю, и этот подход не будет работать.

Как я могу надежно определить, отображается ли панель навигации и в каком положении?

ответ

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); 
     } 

Вы можете рассчитать следующие врезки:

  • Left: 0
  • Top: значение status_bar_height
  • Вправо: 0, если панель навигации не находится внизу, иначе navigation_bar_width
  • Дно: 0, если панель навигации не находится внизу, иначе: если ориентация является ландшафтной (см. Код выше), navigation_bar_height_landscape; else navigation_bar_height.

Значения по умолчанию, как в dimens.xml, являются:

  • status_bar_height: 24 дп
  • navigation_bar_height: 48 дп
  • navigation_bar_height_landscape: 48 дп
  • navigation_bar_width: 48 дп

(возможно, вы захотите вернуться к ним, если каким-то образом вы не получите фактические значения.)

Логика для isNavShowing - это вариация на то, что я реализовал некоторое время назад. Он надежно обнаруживает наличие физической кнопки меню даже на OnePlusOne, использующем CyanogenMod (где пользователь может переключаться между навигационной панелью и аппаратными кнопками через Настройки). Даже при добавлении кнопки меню программного обеспечения в навигационную панель (которая, похоже, добавляется к CM), панель навигации все еще обнаружена правильно.

Логика для isNavAtBottom в основном взята из функции findNavigationBar() в исходном файле, который я связал выше, и должен работать, если вы не используете сильно настроенную сборку Android.