„Android Nougat“ laisvos formos lango režimas: kas tai yra ir kaip kūrėjai gali juo naudotis

Laisvos formos kelių langų režimas yra nepakankamai išnaudojama ir neįvertinta „Android Nougat“ funkcija. Mes paaiškiname, kas tai yra ir kaip kūrėjai gali jį įtraukti.

Laisvos formos lango režimas, kaip pirmą kartą parodė Ars Technica

Kai 2016 m. pradžioje pirmą kartą buvo paskelbta „Android 7.0 Nougat“, „Android“ platformoje atsirado labai pageidaujama funkcija – kelių langų palaikymas. Daugelis žmonių žino, kad pagal numatytuosius nustatymus visuose „Android Nougat“ telefonuose ir planšetiniuose kompiuteriuose įgalintas padalinto ekrano kelių langų palaikymas. „Android“ TV įrenginiuose su „Android Nougat“ palaikomas kelių langų „vaizdas vaizde“ palaikymas.

Tačiau „Android Nougat“ yra trečiasis kelių langų režimas, apie kurį mažai žmonių žino: laisvos formos lango režimas. Šis režimas leidžia „Android“ pateikti programas kaip slankiuosius langus, kuriuos vartotojas gali perkelti ir keisti dydį. Iš esmės tai yra „Android“ įdiegimas a krovimo langų tvarkyklė.

Viduje Android SDK dokumentacija, jame teigiama, kad:

Didesnių įrenginių gamintojai gali pasirinkti įjungti laisvos formos režimą, kuriame vartotojas gali laisvai keisti kiekvienos veiklos dydį. Jei gamintojas įgalina šią funkciją, įrenginys siūlo ne tik padalinto ekrano režimą, bet ir laisvos formos režimą.

Ir taip pat, į „Android 7.0“ CDD:

Įrenginio diegimas su xlarge ekrano dydžiu TURI palaikyti laisvos formos režimą.

Tai rodo, kad bet kuriame naujame didelio ekrano „Android“ įrenginyje, kuris tiekiamas su „Android 7.0“, gamintojas gali įjungti laisvos formos lango režimą.

Tačiau tai tikrai nėra griežtas reikalavimas. Galima priversti bet koks „Android Nougat“ įrenginys (su įjungtomis kūrėjo parinktimis), palaikantis laisvos formos lango režimą vienu iš dviejų skirtingų metodų:


Laisvos formos lango režimo įgalinimas bet kuriame „Android Nougat“ įrenginyje

Įjungus parinktį „Priverstinai keisti veiklos dydį“, programos gali veikti laisvos formos režimu bet kuriame įrenginyje

1 būdas (reikalingas kompiuteris su adb)

Įsitikinkite, kad kūrėjo parinktyse įgalintas USB derinimas. Tada prijunkite įrenginį prie kompiuterio, kuriame įdiegtas adb, ir vykdykite šią komandą:

adb shell settings put global enable_freeform_support 1

2 būdas (jokių papildomų reikalavimų)

Kūrėjo parinkčių apačioje įgalinkite parinktį „Priverstinai keisti veiklos dydį“.

Abu šie metodai reikalauja iš naujo paleisti sistemos vartotojo sąsają, kad jie įsigaliotų. Lengviausias būdas tai padaryti – iš naujo paleisti įrenginį (arba, jei įrenginys yra įsišaknijęs, galite tiesiog užmušti com.android.systemui procesas)


Gerai, taigi laisvos formos režimas įjungtas… kas dabar?

Jei įjungėte laisvos formos režimą naudodami 1 metodą, meniu Apžvalga programos įrašuose bus naujas mygtukas, skirtas paleisti programą į laisvos formos lango režimą.

Tačiau naudojant 2 metodą neįmanoma paleisti programos į laisvos formos režimą per pačią „Android“. Laimei, bet kuri trečiosios šalies paleidimo priemonė gali paleisti programą į laisvos formos lango režimą naudojant standartines Android API, kurios buvo užbaigtos kaip 24 API lygio dalis.

Raktas norint paleisti programą laisvos formos režimu yra paskambinti ActivityOptions.setLaunchBounds() metodas. Šis metodas reikalauja a Rect kaip argumentą, kuriame yra lango ribos, su kuriomis programa bus paleista.

Tada galite paleisti programą naudodami startActivity(Intent, Bundle). Jei dar neturite ActivityOptions paketą, galite sukurti jį naudodami ActivityOptions.makeBasic() ir tada skambina setLaunchBounds() ant ką tik sukurto ryšulio.

Atminkite, kad pagal numatytuosius nustatymus, jei apžvalgos ekrane jau yra programos užduotis, tada „Android“ tiesiog nukreips jus į esamą (viso ekrano) užduotį, kurią anksčiau paleido Vartotojas. Prieš bandydami paleisti programą laisvos formos lange, skiltyje Apžvalga turėsite išvalyti visas programos užduotis. (Programoms su veikla, kuri paleidžiama standard arba singleTop režimus, galite priversti atidaryti naują langą, pridėdami Intent.FLAG_ACTIVITY_MULTIPLE_TASK prieš skambindami pažymėkite ketinimą startActivity().)


Kaip veikia laisvos formos režimas po gaubtu?

Yra puikus straipsnis parašyta, kaip paaiškinama, kaip kelių langų režimas, įskaitant laisvos formos režimą, yra įdiegtas Android Nougat. (PASTABA: straipsnis parašytas kinų kalba, todėl būtinai paleiskite jį per „Google“ vertėją)

Trumpai tariant, programos laisvos formos režimu veikia atskirame krūvoje nuo likusios sistemos (pagalvokite: virtualus darbalaukis). Todėl laisvos formos programos negali paleisti paleidimo priemonės arba kitos viso ekrano programos.

Programos, veikiančios laisvos formos režimu (kurios neturi android: windowIsFloating nustatyta kaip tiesa) turėti a DecorCaptionView pridėta kaip aukščiausio lygio vaikas DecorView. Šiame vaizde yra a LinearLayout lango antraštės juostos apibrėžimas, skirtas langui perkelti, maksimaliai padidinti ir uždaryti. Nors asmeniškai to nerekomenduoju, šį rodinį galima pasiekti ir tinkinti gavus DecorView naudojant Window.getDecorView(), mesti jį į a ViewGroup ir tada pasiekti savo antrinius vaizdus.

Bet kuri programa, sukurta taip, kad gerai veiktų naudojant „Android“ standartinį padalinto ekrano kelių langų režimą, veiks laisvos formos režimu. isInMultiWindowMode() grįš „true“ programoms, veikiančioms laisvos formos režimu. Yra keletas kitų viešai prieinamų klasių ir metodų, kuriuos programa gali naudoti ir kurie yra konkrečiai susiję su laisvos formos režimu:

  • Window.setDecorCaptionShade(): šis metodas gali būti naudojamas norint nepaisyti antraštės valdiklių (didinimo ir uždarymo mygtuko) laisvos formos režimo programoms.
  • Window.setRestrictedCaptionAreaListener(): tai gali būti naudojama aptikti, kada langas perkeliamas laisvos formos režimu. The Window.OnRectrictedCaptionAreaChangedListener iškviečiamas kiekvieną kartą, kai pasikeičia antraštės valdiklių padėtis (kai vartotojas judina langą), ir pateikia a Rect su naujomis antraštės valdiklių ribomis.
  • ActivityInfo.WindowLayout: šioje klasėje yra programos apraše nurodyta informacija apie pradinę laisvos formos lango padėtį, kurią programa gali paprašyti paleidusi. Pavyzdžiui, galite išvardyti toliau nurodytus dalykus jūsų manifesto žyma:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Tada, kai įrenginys jau veikia laisvos formos režimu ir programa bus paleista, ji bus paleista su šiomis nurodytomis ribomis.

Laisvos formos lango režimo pavyzdžiai

Užduočių juosta prideda pradžios meniu ir naujausių programų dėklą, kad papildytų laisvos formos lango režimą

2016 m. vasarą, kai „Android Nougat“ vis dar buvo kūrėjo peržiūra, išleidau programą pavadinimu Užduočių juosta kuriame pateikiamas į „Windows“ panašus pradžios meniu ir naujausių programų sąrašas sistemos perdangoje. Tai leidžia Nougat naudotojams paleisti programas laisvos formos lango režimu – ir kadangi užduočių juosta naudoja perdangą, ji gali likti ekrane laisvos formos lango aplinkoje. Užduočių juostos ir laisvos formos režimo derinys suteikia bet kuriam Android įrenginiui, ypač planšetiniams kompiuteriams, panašų į kompiuterį.

Tu gali atsisiųskite užduočių juostą „Google Play“ arba peržiūrėti šaltinio kodą save „GitHub“. Be šiame straipsnyje paminėtų sąvokų, aš taip pat naudoju keletą gudrybių, kad laisvos formos režimo aplinka būtų aktyvi net tada, kai ekrane nerodomi jokie laisvos formos langai. Vartotojai taip pat gali pasirinktinai nustatyti užduočių juostą kaip numatytąją paleidimo priemonę, kad jų įrenginys būtų automatiškai paleistas į laisvos formos režimo aplinką.

Kadangi nėra įrenginių, kurie oficialiai pristatomi su laisvos formos langų palaikymu, kurį įgalino OĮG (šiuo metu), rekomenduoju naudoti užduočių juostą kaip įrankį, skirtą kūrėjams išbandyti savo programas laisvos formos lango aplinkoje įrenginiuose, kurie kitaip nepalaiko tai.

Be užduočių juostos, aš taip pat pakeičiau Launcher3 šaltinio kodą iš AOSP, kad jis galėtų paleisti programas į laisvos formos režimą. Tai tiesioginis pradinės „Android 7.1.1“ paleidimo priemonės klonas su minimaliais pakeitimais, kad būtų galima paleisti laisvos formos programas. Pateikiau šią modifikuotą paleidimo priemonę, tikėdamasis, kad kiti kūrėjai įdiegs laisvos formos langų paleidimo palaikymą savo tinkintose paleidimo priemonėse. Tu gali peržiūrėti šaltinio kodą „GitHub“ arba atsisiųskite APK pavyzdį.

Tikiuosi, kad pasirinktinių paleidimo priemonių kūrėjai galės panaudoti šį kodą ir įgalinti laisvos formos paleidimo palaikymą langų programos tiems vartotojams, kurie nori didesnio lankstumo valdydami didelius ekranus prietaisai.