Андроид Ноугат Фрееформ Виндов Моде: шта је то и како програмери могу да га искористе

Режим са више прозора слободног облика је недовољно искоришћена и недовољно цењена функција у Андроид Ноугат-у. Објашњавамо шта је то и како програмери могу да га уграде.

Режим прозора слободног облика, као што је први показао Арс Тецхница

Када је Андроид 7.0 Ноугат први пут најављен почетком 2016. године, донео је са собом много тражену функцију на Андроид платформи — подршку за више прозора. Већина људи је свесна подршке за више прозора подељеног екрана која је подразумевано омогућена на свим Андроид Ноугат телефонима и таблетима. Андроид ТВ уређаји са Андроид Ноугат-ом долазе са подршком за подршку за више прозора слика у слици.

Међутим, у Андроид Ноугат-у постоји и трећи режим са више прозора за који није много људи свесно: режим прозора слободног облика. Овај режим омогућава Андроиду да представи апликације као плутајуће прозоре које корисник може померити и променити по жељи. То је у суштини Андроид-ова имплементација а менаџер прозора за слагање.

У Андроид СДК документација, наводи се да:

Произвођачи већих уређаја могу изабрати да омогуће режим слободног облика, у којем корисник може слободно да мења величину сваке активности. Ако произвођач омогући ову функцију, уређај нуди режим слободног облика поред режима подељеног екрана.

И такође, у Андроид 7.0 ЦДД:

Имплементације уређаја са величином екрана кларге ТРЕБА да подржавају режим слободног облика.

Ово указује на то да би сваки нови Андроид уређај са великим екраном који се испоручује са Андроидом 7.0 могао потенцијално имати режим прозора слободног облика који је омогућио произвођач.

Међутим, ово апсолутно није тежак захтев. Могуће је присилити било који Андроид Ноугат уређај (са омогућеним опцијама за програмере) који подржава режим прозора слободног облика користећи један од два различита метода:


Омогућавање режима прозора слободног облика на било ком Андроид Ноугат уређају

Укључивање опције „Присилно мењање величине активности“ омогућава апликацијама да раде у слободном режиму на било ком уређају

Метод 1 (потребан је рачунар са адб-ом)

Уверите се да је УСБ отклањање грешака омогућено у опцијама за програмере. Затим повежите свој уређај са рачунаром са инсталираним адб-ом и извршите следећу команду:

adb shell settings put global enable_freeform_support 1

Метод 2 (без додатних захтева)

Омогућите опцију „Присилно мењање величине активности“ на дну Опције за програмере.

Обе ове методе захтевају да се кориснички интерфејс система поново покрене пре него што ступе на снагу. Најлакши начин да то урадите је да поново покренете уређај (или, ако је ваш уређај роотан, можете једноставно да убијете com.android.systemui процес)


ОК, значи режим слободног облика је омогућен... шта сад?

Ако сте омогућили режим слободне форме користећи метод 1, тада ће се појавити ново дугме на уносима апликације у менију Преглед за покретање апликације у режиму прозора слободног облика.

Са 2. методом, међутим, није могуће покренути апликацију у режиму слободног облика преко самог Андроид-а. Срећом, могуће је да било који покретач треће стране покрене апликацију у режиму прозора слободног облика користећи стандардне Андроид АПИ-је који су финализовани као део АПИ нивоа 24.

Кључ за покретање апликације у слободном режиму је позивање ActivityOptions.setLaunchBounds() методом. Овај метод захтева а Rect као аргумент, који садржи границе прозора са којима ће се апликација покренути.

Затим можете покренути апликацију са startActivity(Intent, Bundle). Ако већ немате ActivityOptions пакет, можете га креирати са ActivityOptions.makeBasic() а затим зове setLaunchBounds() на тек створеном снопу.

Имајте на уму да подразумевано, ако већ постоји задатак за апликацију на екрану Преглед, онда Андроид ће вас једноставно преусмерити на постојећи задатак (на целом екрану) који је претходно покренуо корисник. Мораћете да обришете све задатке за апликацију у Прегледу пре него што покушате да покренете апликацију у прозору слободног облика. (За апликације са активностима које се покрећу у standard или singleTop режимима, можете присилити да се отвори нови прозор додавањем Intent.FLAG_ACTIVITY_MULTIPLE_TASK означите намером пре позивања startActivity().)


Како режим слободног облика функционише испод хаубе?

Постоји одличан чланак написано које објашњава како је режим са више прозора, укључујући режим слободног облика, имплементиран у Андроид Ноугат. (НАПОМЕНА: чланак је написан на кинеском, па га обавезно покрените преко Гоогле преводиоца)

Укратко, апликације у режиму слободног облика раде у одвојеној групи од остатка система (мислите: виртуелна радна површина). Због тога није могуће да се апликације слободног облика покрећу на покретачу или на другој апликацији преко целог екрана.

Апликације које раде у слободном режиму (које немају android: windowIsFloating постављено на тачно) имају а DecorCaptionView додато као дете највишег нивоа DecorView. Овај поглед садржи а LinearLayout дефинисање траке са натписима прозора за померање, максимизирање и затварање прозора. Иако га лично не препоручујем, могуће је приступити и прилагодити овом приказу тако што ћете добити DecorView Користећи Window.getDecorView(), бацајући га на а ViewGroup а затим приступа његовим подређеним приказима.

Свака апликација која је дизајнирана да се добро понаша у Андроид-овом стандардном режиму са више прозора подељеног екрана радиће у режиму слободног облика. isInMultiWindowMode() ће вратити труе за апликације које раде у слободном облику. Постоји неколико других јавно доступних класа и метода које апликација може да користи, а посебно се односе на режим слободног облика:

  • Window.setDecorCaptionShade(): овај метод се може користити да се замени нијанса контрола натписа (дугме за увећање и затварање) за апликације у режиму слободног облика.
  • Window.setRestrictedCaptionAreaListener(): ово се може користити за откривање када се прозор помера у слободном облику. Тхе Window.OnRectrictedCaptionAreaChangedListener позива се сваки пут када се промени позиција контроле натписа (када корисник помера прозор) и обезбеђује а Rect са новим границама контрола натписа.
  • ActivityInfo.WindowLayout: ова класа садржи информације декларисане у манифесту апликације о почетном позиционирању прозора слободног облика који апликација може да затражи при покретању. На пример, можете навести следеће у ознака вашег манифеста:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Затим, када је уређај већ у режиму слободног облика и апликација је покренута, она ће се покренути са овим одређеним границама.

Примери режима прозора слободног облика у акцији

Трака задатака додаје старт мени и траку са недавним апликацијама како би употпунила режим прозора слободног облика

У лето 2016, док је Андроид Ноугат још увек био преглед за програмере, објавио сам апликацију под називом Трака задатака који пружа Старт мени сличан Виндовс-у и листу недавних апликација у системском преклопу. Омогућава корисницима на Ноугат-у да покрећу апликације у режиму прозора слободног облика — а пошто трака задатака користи преклапање, може остати на екрану у окружењу прозора слободног облика. Комбинација траке задатака и режима слободног облика даје сваком Андроид уређају, посебно таблетима, осећај налик на рачунар.

Можете преузми траку задатака на Гоогле Плаи-у, или погледајте изворни код себе на ГитХуб-у. Поред концепата поменутих у овом чланку, користим и неколико трикова да одржим окружење слободног облика активним чак и када на екрану нису приказани прозори слободног облика. Корисници такође могу опционо да поставе траку задатака као подразумевани покретач како би омогућили свом уређају да се аутоматски покрене у окружењу слободног облика.

Пошто нема уређаја који се званично испоручују са подршком за прозоре слободног облика коју је омогућио ОЕМ (у тренутку писања овог текста), препоручујем користећи траку задатака као алат за програмере да тестирају своје апликације у окружењу прозора слободног облика на уређајима који иначе не подржавају то.

Поред траке задатака, такође сам модификовао изворни код Лаунцхер3 из АОСП-а како бих му омогућио да покреће апликације у режиму слободног облика. Ово је прави клон основног Андроид 7.1.1 покретача, са минималним модификацијама неопходним да би се омогућило покретање апликација слободног облика. Дао сам овај модификовани покретач у нади да ће други програмери имплементирати подршку за покретање прозора слободног облика у својим прилагођеним покретачима. Можете погледајте изворни код на ГитХуб-у, или преузмите узорак АПК-а.

Надам се да програмери прилагођених покретача могу да искористе овај код и омогуће подршку за покретање слободног облика апликације за прозоре за оне кориснике који желе већу флексибилност за управљање прозорима на својим великим екранима уређаја.