Режим Погружения В Android 4.4 Kitkat

31 октября 2013 года компания Google представила новую версию ОС Android 4.4 KitKat, в которой добавлено множество интересных функций для разработчиков.

Одной из таких функций является Режим погружения (режим погружения).

Режим погружения — это режим, в котором ваша программа отображается пользователю на весь экран, при этом не видны никакие системные панели, включая панель навигации (та, что с кнопкой «Назад»).

До Android 4.4 также была возможность скрыть системные панели ( Панель навигации И панель состояния ).

Но у существующей версии был один недостаток — пользователь не мог полностью погрузиться в контент, так как любое нажатие на контент снова приводило к отображению системных панелей.

Новый режим погружения добавляет еще один способ взаимодействия с дисплеем системной панели.

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

Чтобы помочь пользователю понять, как вывести системные панели из полноэкранного режима, при первом запуске приложения ему автоматически будет представлено системное сообщение, сообщающее, как вернуть эти панели на экран.



Режим погружения в Android 4.4 KitKat



Режим погружения в Android 4.4 KitKat



Режим погружения в Android 4.4 KitKat

Кроме того, вы можете подумать, что с использованием этого режима есть еще одна проблема.

Например, пользователь запустил программу рисования и хочет провести линию от края экрана, и как возможно, что в этом случае ему отобразится системная панель? Да, но приложение также будет получать сообщения от касаний по экрану и будет рисовать линию.

Кстати, сделать системные панели теперь просто полупрозрачными можно с помощью двух новых тем — Theme.Holo.NoActionBar.TranslucentDecor И Theme.Holo.Light.NoActionBar.TranslucentDecor .

Но стоит помнить, что в этом случае ваш контент займет всю площадь экрана и будет виден даже за полупрозрачными панелями системы.

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

подходит для системыWindows равно истине.

Не очень приятно в этих темах то, что они используют не полную прозрачность для панелей, а градиентную (от черного к полупрозрачному), что не всегда выглядит красиво.

Если вы создаете свою собственную тему, вы можете наследовать эти новые темы или вручную добавить два новых свойства.

окноПолупрозрачныйНавигация (прозрачна ли панель навигации системы) и окноTranslucentStatus (это строка состояния системы с прозрачными часами).

Как вернуться в полноэкранный режим, когда панели уже отображаются? У пользователя есть несколько вариантов — нажать на любой контент за пределами системных панелей, подождать некоторое время, пока панели исчезнут автоматически, или провести пальцем от центра экрана к краю.

Все эти возможности программист может предусмотреть в своем приложении.

Для достижения этой цели команда Android упростила реализацию способов взаимодействия с режимом погружения.

Существует два типа режима погружения — обычный И липкий («липкий»).

В обычном режиме программист должен решить, когда скрывать панели, но в прикрепленном режиме системные панели будут скрыты автоматически.

Для установки обоих типов режима погружения необходимо использовать метод setSystemUiVisibility() , просто передайте в параметры разные флаги.

Этот метод необходимо вызывать из так называемого Decor View, который представляет внешний вид окна Activity со всем его дизайном и содержимым.

Получить ссылку на это представление очень легко.

  
  
  
  
  
  
   

mDecorView = getWindow().

getDecorView();

Давайте подробнее рассмотрим оба типа режима погружения.



Обычный режим погружения

Для установки обычного режима используйте флаг SYSTEM_UI_FLAG_IMMERSIVE как параметр метода setSystemUiVisibility() .

Лучший способ работы с обычным иммерсивным режимом — сделать два простых метода, которые будут показывать и скрывать системные панели соответственно.



private void hideSystemUI() { mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_IMMERSIVE); } private void showSystemUI() { mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); }

Для тех случаев, когда нужно показать и скрыть системные панели по клику на содержимое ( просмотр содержимого ), вам необходимо использовать следующий код. Это может быть полезно, например, при просмотре таких видео, как YouTube, когда вам не нужно взаимодействовать с контентом во время его просмотра.



contentView.setClickable(true); final GestureDetector clickDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { boolean visible = (mDecorView.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; if (visible) { hideSystemUI(); } else { showSystemUI(); } return true; } }); contentView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return clickDetector.onTouchEvent(motionEvent); } });

Если при этом у вас в приложении есть какие-то свои панели ( элементы управленияView ), которые тоже нужно скрыть вместе с системными, это также можно просто сделать, написав следующий код. Здесь скрытие и появление происходит с использованием анимации альфа-канала и положения Y вашей панели.



mDecorView.setOnSystemUiVisibilityChangeListener( new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int flags) { boolean visible = (flags & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; controlsView.animate() .

alpha(visible ? 1 : 0) .

translationY(visible ? 0 : controlsView.getHeight()); } });

Если при запуске приложения вы хотите показать пользователю, что в приложении есть панели, а затем через некоторое время скрыть их, это тоже довольно легко сделать.



private static final int INITIAL_HIDE_DELAY = 300; @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); delayedHide(INITIAL_HIDE_DELAY); } private final Handler mHideHandler = new Handler() { @Override public void handleMessage(Message msg) { hideSystemUI(); } }; private void delayedHide(int delayMillis) { mHideHandler.removeMessages(0); mHideHandler.sendEmptyMessageDelayed(0, delayMillis); }

Иногда вам также может потребоваться отобразить панель, когда окно получает фокус, например, после возврата из вызванного диалогового окна.

Эту опцию можно реализовать с помощью следующего кода.



@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { delayedHide(INITIAL_HIDE_DELAY); } else { mHideHandler.removeMessages(0); } }

В этом случае панель появится, а затем исчезнет через заданное вами время.



Режим погружения

Чтобы установить липкий режим, используйте флаг SYSTEM_UI_FLAG_IMMERSIVE_STICKY как параметр метода setSystemUiVisibility() .

Этот режим чрезвычайно прост. Если вам нужна ситуация, когда системные панели будут скрываться, когда окно получит фокус или пройдет некоторое время после появления панелей, то этот режим для вас.

Чтобы включить этот режим, вам необходимо установить флаг для окна, когда оно находится в фокусе.

SYSTEM_UI_FLAG_IMMERSIVE_STICKY .

В этом режиме, если окно теряет фокус, оно автоматически возвращается в состояние, в котором оно находилось до установки флага.

SYSTEM_UI_FLAG_IMMERSIVE_STICKY , то есть со всеми панелями.

Как только окно получит фокус, панели через некоторое время снова исчезнут, и вам не нужно программировать эту ситуацию вручную.

Чтобы отобразить системные панели, так же, как и в обычном режиме, нужно провести свайпом от краев экрана.

Включение режима Stick осуществляется с помощью простого фрагмента кода.



@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } }

P.S. Материалы, использованные в статье видео Романа Нурика .

Код полных примеров от Романа по использованию этого режима можно скачать.

здесь .

П.

П.

С.

20 ноября появился новый статья в Учебном комплекте для этого режима.

Постараюсь в ближайшее время обновить статью с учетом этого.

Теги: #разработка под Android #kitkat #режим погружения #разработка под Android

Вместе с данным постом часто просматривают: