Оконный режим произвольной формы в Android Nougat: что это такое и как разработчики могут его использовать

click fraud protection

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

Режим окна произвольной формы, впервые продемонстрированный Арс Техника

Когда в начале 2016 года впервые была анонсирована версия Android 7.0 Nougat, она принесла в платформу Android столь востребованную функцию — поддержку нескольких окон. Большинству людей известно о поддержке нескольких окон с разделенным экраном, включенной по умолчанию на всех телефонах и планшетах Android Nougat. Устройства Android TV с Android Nougat поддерживают многооконный режим «картинка в картинке».

Однако в Android Nougat присутствует третий многооконный режим, о котором мало кто знает: оконный режим произвольной формы. Этот режим позволяет Android представлять приложения в виде плавающих окон, которые пользователь может перемещать и изменять их размер по своему желанию. По сути, это реализация Android оконный менеджер стекирования.

в Документация Android SDK, там указано, что:

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

А также, в CDD-версия Android 7.0:

Реализации устройств с размером экрана xlarge ДОЛЖНЫ поддерживать режим произвольной формы.

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

Однако это совершенно не жесткое требование. Можно заставить любой Устройство Android Nougat (с включенными параметрами разработчика) для поддержки режима окна произвольной формы одним из двух различных методов:


Включение режима окна произвольной формы на любом устройстве Android Nougat

Включение опции «Принудительно изменять размер действий» позволяет приложениям запускаться в произвольном режиме на любом устройстве.

Способ 1 (нужен компьютер с adb)

Убедитесь, что отладка по USB включена в настройках разработчика. Затем подключите свое устройство к компьютеру с установленным adb и выполните следующую команду:

adb shell settings put global enable_freeform_support 1

Способ 2 (без дополнительных требований)

Включите опцию «Принудительно изменять размер действий» в нижней части параметров разработчика.

Оба этих метода требуют перезапуска системного пользовательского интерфейса, прежде чем они вступят в силу. Самый простой способ сделать это — перезагрузить устройство (или, если ваше устройство рутировано, вы можете просто убить com.android.systemui процесс)


Хорошо, режим произвольной формы включен… что теперь?

Если вы включили режим произвольной формы с помощью метода 1, в записях приложений в меню «Обзор» появится новая кнопка для запуска приложения в режиме окна произвольной формы.

Однако при использовании метода 2 невозможно запустить приложение в произвольном режиме через сам Android. К счастью, любая сторонняя программа запуска может запустить приложение в режиме окна произвольной формы с использованием стандартных API-интерфейсов Android, которые были доработаны как часть уровня API 24.

Ключом к запуску приложения в произвольном режиме является вызов ActivityOptions.setLaunchBounds() метод. Этот метод занимает Rect в качестве аргумента, содержащего границы окна, с которым приложение будет запускаться.

Затем вы можете запустить приложение с помощью startActivity(Intent, Bundle). Если у вас еще нет ActivityOptions пакет, вы можете создать его с помощью ActivityOptions.makeBasic() а потом звоню setLaunchBounds() на только что созданном пакете.

Обратите внимание, что по умолчанию, если на экране «Обзор» уже есть задача для приложения, Android просто перенаправит вас к существующей (полноэкранной) задаче, которая ранее была запущена пользователь. Вам нужно будет очистить все задачи для приложения в разделе «Обзор», прежде чем пытаться запустить приложение в окне произвольной формы. (Для приложений с действиями, которые запускаются в standard или singleTop режимах вы можете принудительно открыть новое окно, добавив Intent.FLAG_ACTIVITY_MULTIPLE_TASK отметьте намерение перед вызовом startActivity().)


Как работает режим произвольной формы?

Есть отличная статья написано, что объясняет, как в Android Nougat реализован многооконный режим, включая режим произвольной формы. (ПРИМЕЧАНИЕ: статья написана на китайском языке, поэтому обязательно пропустите ее через Google Translate)

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

Приложения, работающие в произвольном режиме (которые не имеют android: windowIsFloating установлено значение true) есть DecorCaptionView добавлен как дочерний элемент верхнего уровня DecorView. Это представление содержит LinearLayout определение строки заголовка окна для перемещения, развертывания и закрытия окна. Хотя я лично не рекомендую это делать, можно получить доступ к этому представлению и настроить его, загрузив DecorView с использованием Window.getDecorView(), приведя его к ViewGroup а затем получить доступ к его дочерним представлениям.

Любое приложение, которое хорошо работает в стандартном многооконном режиме Android с разделенным экраном, будет работать в произвольном режиме. isInMultiWindowMode() вернет true для приложений, работающих в произвольном режиме. Существует несколько других общедоступных классов и методов, которые приложение может использовать и которые относятся конкретно к режиму произвольной формы:

  • Window.setDecorCaptionShade(): этот метод можно использовать для переопределения оттенка элементов управления заголовком (кнопки развертывания и закрытия) для приложений в режиме произвольной формы.
  • Window.setRestrictedCaptionAreaListener(): это можно использовать для обнаружения перемещения окна в режиме произвольной формы. Window.OnRectrictedCaptionAreaChangedListener вызывается каждый раз, когда изменяется положение элементов управления заголовком (когда пользователь перемещает окно) и предоставляет Rect с новыми границами элементов управления надписями.
  • ActivityInfo.WindowLayout: этот класс содержит информацию, объявленную в манифесте приложения, относительно начального положения окна произвольной формы, которое приложение может запросить при запуске. Например, вы можете указать следующее в тег вашего манифеста:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Затем, когда устройство уже находится в режиме произвольной формы и приложение запущено, оно запустится с указанными границами.

Примеры режима окна произвольной формы в действии

На панели задач добавлено меню «Пуск» и панель последних приложений, дополняющая режим окна произвольной формы.

Летом 2016 года, когда Android Nougat еще находился в предварительной версии для разработчиков, я выпустил приложение под названием Панель задач который обеспечивает меню «Пуск» в стиле Windows и список последних приложений в системном наложении. Он позволяет пользователям Nougat запускать приложения в режиме окна произвольной формы, а поскольку панель задач использует наложение, она может оставаться на экране в среде окна произвольной формы. Комбинация панели задач и режима произвольной формы придает любому устройству Android, особенно планшетам, ощущение ПК.

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

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

Помимо панели задач, я также изменил исходный код Launcher3 из AOSP, чтобы он мог запускать приложения в произвольном режиме. Это прямой клон стандартной программы запуска Android 7.1.1 с минимальными изменениями, необходимыми для запуска приложений произвольной формы. Я предоставил этот модифицированный модуль запуска в надежде, что другие разработчики реализуют поддержку запуска окон произвольной формы в своих собственных программах запуска. Ты можешь просмотреть исходный код на GitHub или скачать образец APK.

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