Режим вікна вільної форми Android Nougat: що це таке та як розробники можуть його використовувати

Багатовіконний режим довільної форми — це функція, яка в Android Nougat використовується недостатньо й недооцінюється. Ми пояснюємо, що це таке та як розробники можуть це включити.

Режим вікна довільної форми, як вперше продемонстровано Ars Technica

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

Однак в Android Nougat існує третій багатовіконний режим, про який мало хто знає: віконний режим вільної форми. Цей режим дозволяє Android представляти програми як плаваючі вікна, які користувач може переміщувати та змінювати за бажанням. По суті, це реалізація a диспетчер вікон стекування.

В Документація Android SDK, в ньому зазначено, що:

Виробники більших пристроїв можуть увімкнути режим довільної форми, у якому користувач може вільно змінювати розмір кожної дії. Якщо виробник увімкнув цю функцію, пристрій пропонує режим довільної форми на додаток до режиму розділеного екрана.

А також, в Android 7.0 CDD:

Пристрої з розміром екрана xlarge ПОВИННІ підтримувати режим довільної форми.

Це вказує на те, що будь-який новий пристрій Android з великим екраном, який постачається з Android 7.0, потенційно може мати віконний режим вільної форми, увімкнений виробником.

Однак це абсолютно не жорстка вимога. Змусити можна будь-який Пристрій Android Nougat (з увімкненими параметрами розробника) для підтримки режиму вікна довільної форми за допомогою одного з двох різних методів:


Увімкнення режиму вікна вільної форми на будь-якому пристрої Android Nougat

Якщо ввімкнути опцію «Примусово змінювати розмір діяльності», програми можуть працювати в режимі довільної форми на будь-якому пристрої

Спосіб 1 (потрібен комп'ютер з adb)

Переконайтеся, що налагодження USB увімкнено в параметрах розробника. Потім підключіть свій пристрій до комп’ютера з встановленим adb і виконайте таку команду:

adb shell settings put global enable_freeform_support 1

Спосіб 2 (без додаткових вимог)

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

Обидва ці методи вимагають перезапуску інтерфейсу користувача системи, перш ніж вони почнуть діяти. Найпростіший спосіб зробити це – перезавантажити пристрій (або, якщо ваш пристрій має root права, ви можете просто вбити com.android.systemui процес)


Добре, режим вільної форми ввімкнено… що тепер?

Якщо ви ввімкнули режим довільної форми за допомогою методу 1, у записах програми в меню «Огляд» з’явиться нова кнопка для запуску програми в режимі вікна довільної форми.

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

Ключем до запуску програми в режимі довільної форми є виклик ActivityOptions.setLaunchBounds() метод. Цей метод вимагає a Rect як аргумент, що містить межі вікна, з якими запускатиметься програма.

Потім ви можете запустити програму за допомогою startActivity(Intent, Bundle). Якщо у вас ще немає ActivityOptions пакет, ви можете створити його за допомогою ActivityOptions.makeBasic() а потім дзвонить setLaunchBounds() на щойно створеному пакеті.

Зауважте, що за умовчанням, якщо на екрані огляду вже є завдання для програми, тоді Android просто перенаправить вас до існуючого (повноекранного) завдання, яке раніше було запущено користувача. Перш ніж спробувати запустити програму у вікні довільної форми, вам потрібно буде очистити всі завдання для програми в Огляді. (Для програм із діяльністю, які запускаються в standard або singleTop режими, ви можете примусово відкрити нове вікно, додавши Intent.FLAG_ACTIVITY_MULTIPLE_TASK позначте намір перед викликом startActivity().)


Як режим вільної форми працює під капотом?

Існує відмінна стаття написано, що пояснює, як багатовіконний режим, включаючи режим довільної форми, реалізовано в Android Nougat. (ПРИМІТКА: стаття написана китайською мовою, тому не забудьте запустити її через Google Translate)

У двох словах, програми в режимі вільної форми працюють окремо від решти системи (подумайте: віртуальний робочий стіл). Таким чином, програми довільної форми не можуть працювати поверх панелі запуску чи іншої повноекранної програми.

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

Будь-яка програма, розроблена для роботи в стандартному багатовіконному режимі розділеного екрана Android, працюватиме в режимі довільної форми. isInMultiWindowMode() поверне значення true для програм, що працюють у режимі довільної форми. Є кілька інших загальнодоступних класів і методів, які програма може використовувати, які стосуються режиму вільної форми:

  • Window.setDecorCaptionShade(): цей метод можна використовувати для заміни тіні елементів керування підписами (кнопка розгортання та закриття) для програм у режимі довільної форми.
  • Window.setRestrictedCaptionAreaListener(): це можна використовувати для виявлення переміщення вікна в режимі довільної форми. The Window.OnRectrictedCaptionAreaChangedListener викликається кожного разу, коли змінюється положення елементів керування заголовком (коли користувач пересуває вікно) і забезпечує a 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.

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