Brīvas formas vairāku logu režīms ir nepietiekami izmantota un nenovērtēta Android Nougat funkcija. Mēs izskaidrojam, kas tas ir un kā izstrādātāji to var iekļaut.
Kad 2016. gada sākumā pirmo reizi tika paziņots par operētājsistēmu Android 7.0 Nougat, tā Android platformā ienesa ļoti pieprasītu funkciju — vairāku logu atbalstu. Lielākā daļa cilvēku zina, ka dalītā ekrāna vairāku logu atbalsts ir iespējots pēc noklusējuma visos Android Nougat tālruņos un planšetdatoros. Android TV ierīcēm ar Android Nougat tiek atbalstīts attēls attēlā vairāku logu atbalsts.
Tomēr operētājsistēmā Android Nougat ir pieejams trešais vairāku logu režīms, par kuru nezina daudz cilvēku: brīvas formas loga režīms. Šis režīms ļauj Android lietotnes parādīt kā peldošus logus, kurus lietotājs var pārvietot un mainīt izmērus pēc vēlēšanās. Būtībā tā ir Android ieviešana a sakraušanas logu pārvaldnieks.
Iekš Android SDK dokumentācija, tajā teikts, ka:
Lielāku ierīču ražotāji var izvēlēties iespējot brīvas formas režīmu, kurā lietotājs var brīvi mainīt katras darbības lielumu. Ja ražotājs iespējo šo funkciju, ierīce papildus dalītā ekrāna režīmam piedāvā brīvas formas režīmu.
Un arī šajā Android 7.0 CDD:
Ierīces ieviešanai ar ekrāna izmēru xlarge BŪTU jāatbalsta brīvas formas režīms.
Tas norāda, ka jebkurai jaunai liela ekrāna Android ierīcei, kas tiek piegādāta ar operētājsistēmu Android 7.0, ražotājs, iespējams, ir iespējojis brīvas formas loga režīmu.
Tomēr šī absolūti nav stingra prasība. Ir iespējams piespiest jebkura Android Nougat ierīce (ar iespējotām izstrādātāja opcijām), lai atbalstītu brīvas formas loga režīmu, izmantojot vienu no divām dažādām metodēm:
Brīvas formas loga režīma iespējošana jebkurā Android Nougat ierīcē
1. metode (nepieciešams dators ar adb)
Pārliecinieties, vai izstrādātāja opcijās ir iespējota USB atkļūdošana. Pēc tam pievienojiet ierīci datoram, kurā ir instalēts adb, un izpildiet šo komandu:
adb shell settings put global enable_freeform_support 1
2. metode (bez papildu prasībām)
Izstrādātāja opciju apakšdaļā iespējojiet opciju “Piespiest darbību mainīt izmērus”.
Lai izmantotu abas šīs metodes, ir jārestartē sistēmas lietotāja saskarne, lai tās varētu stāties spēkā. Vienkāršākais veids, kā to izdarīt, ir restartēt ierīci (vai, ja ierīcei ir saknes, varat vienkārši iznīcināt com.android.systemui
process)
Labi, tātad brīvas formas režīms ir iespējots… ko tagad?
Ja iespējojāt brīvas formas režīmu, izmantojot 1. metodi, izvēlnes Pārskats lietotņu ierakstos būs jauna poga, lai palaistu programmu brīvas formas loga režīmā.
Tomēr ar 2. metodi nav iespējams palaist lietotni brīvas formas režīmā, izmantojot pašu Android. Par laimi, jebkura trešās puses palaišanas programma var palaist lietotni brīvas formas loga režīmā izmantojot standarta Android API, kas tika pabeigtas kā API 24. līmeņa daļa.
Galvenais, lai palaistu lietotni brīvas formas režīmā, ir zvanīt uz ActivityOptions.setLaunchBounds()
metodi. Šī metode aizņem a Rect
kā argumentu, kas ietver loga robežas, ar kurām programma tiks palaists.
Pēc tam varat palaist lietotni ar startActivity(Intent, Bundle)
. Ja jums vēl nav ActivityOptions
paketi, varat to izveidot ar ActivityOptions.makeBasic()
un tad zvana setLaunchBounds()
uz tikko izveidotā saišķa.
Ņemiet vērā: ja pēc noklusējuma ekrānā Kopsavilkums jau ir lietotnes uzdevums, tad Android vienkārši novirzīs jūs uz esošo (pilnekrāna) uzdevumu, ko iepriekš palaida lietotājs. Pirms mēģināt palaist lietotni brīvas formas logā, sadaļā Pārskats ir jānotīra visi lietotnes uzdevumi. (Lietotnēm ar darbībām, kas tiek palaistas standard
vai singleTop
režīmos, varat piespiest atvērt jaunu logu, pievienojot Intent.FLAG_ACTIVITY_MULTIPLE_TASK
pirms zvanīšanas atzīmējiet to ar karodziņu startActivity()
.)
Kā zem pārsega darbojas brīvās formas režīms?
Tur ir izcils raksts rakstīts, kurā paskaidrots, kā Android Nougat tiek ieviests vairāku logu režīms, tostarp brīvas formas režīms. (PIEZĪME: raksts ir uzrakstīts ķīniešu valodā, tāpēc noteikti palaist to, izmantojot Google tulkotāju)
Īsumā, lietotnes brīvas formas režīmā darbojas atsevišķā kaudzē no pārējās sistēmas (domājiet: virtuālā darbvirsma). Tāpēc brīvas formas lietotnēm nav iespējams darboties virs palaišanas programmas vai citas pilnekrāna programmas.
Lietotnes, kas darbojas brīvas formas režīmā (kurām nav android: windowIsFloating
iestatīts uz True) ir a DecorCaptionView
pievienots kā augstākā līmeņa bērns DecorView
. Šis skats satur a LinearLayout
loga parakstu joslas noteikšana loga pārvietošanai, palielināšanai un aizvēršanai. Lai gan es to neiesaku personīgi, šim skatam ir iespējams piekļūt un to pielāgot, iegūstot DecorView
izmantojot Window.getDecorView()
, nododot to uz a ViewGroup
un pēc tam piekļūt saviem bērnu skatiem.
Jebkura lietotne, kas ir izstrādāta, lai labi darbotos Android standarta dalītā ekrāna vairāku logu režīmā, darbosies brīvas formas režīmā. isInMultiWindowMode()
tiks atgriezta taisnība lietotnēm, kas darbojas brīvas formas režīmā. Ir dažas citas publiski pieejamas klases un metodes, ko lietotne var izmantot, kas ir īpaši saistītas ar brīvas formas režīmu.
-
Window.setDecorCaptionShade()
: šo metodi var izmantot, lai ignorētu subtitru vadīklu ēnojumu (pogas palielināšana un aizvēršana) programmām brīvas formas režīmā. -
Window.setRestrictedCaptionAreaListener()
: to var izmantot, lai noteiktu, kad logs tiek pārvietots brīvas formas režīmā. TheWindow.OnRectrictedCaptionAreaChangedListener
tiek izsaukts katru reizi, kad mainās parakstu vadīklu pozīcija (kad lietotājs pārvieto logu), un nodrošina aRect
ar jaunajām parakstu vadīklu robežām. -
ActivityInfo.WindowLayout
: šī klase satur informāciju, kas norādīta lietotnes manifestā par brīvas formas loga sākotnējo novietojumu, ko lietotne var pieprasīt palaišanas laikā. Piemēram, sadaļā varat uzskaitīt tālāk norādīto jūsu manifesta tags:
Pēc tam, kad ierīce jau ir brīvas formas režīmā un lietotne tiek palaista, tā tiks palaista ar šīm norādītajām robežām.android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
Brīvas formas loga režīma piemēri darbībā
2016. gada vasarā, kad Android Nougat vēl bija izstrādātāja priekšskatījums, es izlaidu lietotni ar nosaukumu Uzdevumjosla kas nodrošina Windows līdzīgu sākuma izvēlni un jaunāko lietotņu sarakstu sistēmas pārklājumā. Tas ļauj lietotājiem Nougat palaist lietotnes brīvas formas loga režīmā — un, tā kā uzdevumjoslā tiek izmantots pārklājums, tā var palikt ekrānā brīvas formas loga vidē. Uzdevumjoslas un brīvās formas režīma kombinācija jebkurai Android ierīcei, īpaši planšetdatoriem, nodrošina datoram līdzīgu sajūtu.
Jūs varat lejupielādēt uzdevumjoslu pakalpojumā Google Play vai apskatīt avota kodu sevi GitHub. Papildus šajā rakstā minētajiem jēdzieniem es izmantoju arī dažus trikus, lai brīvās formas režīma vide būtu aktīva pat tad, ja ekrānā netiek rādīts neviens brīvas formas logs. Lietotāji var arī pēc izvēles iestatīt uzdevumjoslu kā noklusējuma palaišanas programmu, lai ļautu viņu ierīcei automātiski palaist brīvas formas režīma vidi.
Tā kā nav nevienas ierīces, kas oficiāli piegādātas ar brīvas formas logu atbalstu, ko iespējojis oriģinālā aprīkojuma ražotājs (šī rakstīšanas brīdī), es iesaku uzdevumjoslas izmantošana kā rīks izstrādātājiem, lai pārbaudītu savas lietotnes brīvas formas loga vidē ierīcēs, kuras citādi neatbalsta to.
Papildus uzdevumjoslai esmu arī modificējis Launcher3 avota kodu no AOSP, lai tas varētu palaist programmas brīvas formas režīmā. Šis ir standarta Android 7.1.1 palaidēja klons ar minimālajām modifikācijām, kas nepieciešamas, lai tā varētu palaist brīvas formas lietotnes. Esmu nodrošinājis šo modificēto palaidēju, cerot, ka citi izstrādātāji ieviesīs atbalstu brīvas formas logu palaišanai savos pielāgotajos palaišanas programmās. Jūs varat apskatīt avota kodu vietnē GitHub vai lejupielādējiet APK paraugu.
Es ceru, ka pielāgoto palaidēju izstrādātāji var izmantot šo kodu un nodrošināt atbalstu brīvas formas palaišanai logu lietotnes tiem lietotājiem, kuri vēlas lielāku logu pārvaldības elastību lielajā ekrānā ierīces.