A szabad formájú többablakos mód egy kevéssé kihasznált és alulértékelt funkció az Android Nougatban. Elmagyarázzuk, mi ez, és hogyan építhetik be a fejlesztők.
Amikor 2016 elején először bejelentették az Android 7.0 Nougat-ot, egy nagyon kért funkciót hozott az Android platformra: a több ablakos támogatást. A legtöbb ember tisztában van az osztott képernyős, több ablakos támogatással, amely alapértelmezés szerint engedélyezve van minden Android Nougat telefonon és táblagépen. Az Android Nougat rendszerrel rendelkező Android TV-eszközök támogatják a kép a képben több ablakos támogatást.
Az Android Nougatban azonban van egy harmadik többablakos mód, amelyről nem sokan tudnak: szabad formájú ablakmód. Ez a mód lehetővé teszi az Android számára, hogy az alkalmazásokat lebegő ablakokként jelenítse meg, amelyeket a felhasználó tetszés szerint áthelyezhet és átméretezhet. Ez lényegében az Android implementációja a egymásra rakott ablakkezelő.
Ban,-ben Android SDK dokumentáció, azt írja ki, hogy:
A nagyobb készülékek gyártói választhatják a szabad formájú mód engedélyezését, amelyben a felhasználó szabadon átméretezheti az egyes tevékenységeket. Ha a gyártó engedélyezi ezt a funkciót, a készülék az osztott képernyős mód mellett szabad formájú módot is kínál.
És azt is, a Android 7.0 CDD:
Az xlarge képernyőmérettel rendelkező eszközmegvalósításoknak támogatniuk KELL a szabad formájú módot.
Ez azt jelzi, hogy az Android 7.0-val szállított új, nagy képernyős Android-eszközökön előfordulhat, hogy a gyártó engedélyezte a szabad formájú ablakmódot.
Ez azonban egyáltalán nem szigorú követelmény. Lehet kényszeríteni Bármi Android Nougat eszköz (engedélyezett fejlesztői beállításokkal), amely támogatja a szabad formájú ablakmódot két különböző módszer egyikével:
A szabad formájú ablak mód engedélyezése bármely Android Nougat eszközön
1. módszer (adb-vel rendelkező számítógép szükséges)
Győződjön meg arról, hogy az USB hibakeresés engedélyezve van a Fejlesztői beállításokban. Ezután csatlakoztassa eszközét egy olyan számítógéphez, amelyre telepítve van az adb, és hajtsa végre a következő parancsot:
adb shell settings put global enable_freeform_support 1
2. módszer (nincs további követelmény)
Engedélyezze a „Tevékenységek átméretezhetőségének kényszerítése” lehetőséget a Fejlesztői beállítások alján.
Mindkét módszer érvénybe lépése előtt újra kell indítani a rendszer felhasználói felületet. Ennek legegyszerűbb módja az eszköz újraindítása (vagy ha az eszköz rootolt, egyszerűen leállíthatja a com.android.systemui
folyamat)
OK, tehát a szabad formájú mód engedélyezve van… most mi van?
Ha az 1. módszerrel engedélyezte a szabad formájú módot, akkor az Áttekintés menü alkalmazásbejegyzéseinél egy új gomb jelenik meg az alkalmazás szabad formájú ablak módba történő elindításához.
A 2. módszerrel azonban nem lehet egy alkalmazást szabad formájú módba indítani magán az Androidon keresztül. Szerencsére, bármely harmadik féltől származó indító elindíthatja az alkalmazást szabad formájú ablak módba szabványos Android API-k használatával, amelyeket a 24. API-szint részeként véglegesítettek.
Az alkalmazás szabad formájú módban történő indításának kulcsa a ActivityOptions.setLaunchBounds()
módszer. Ez a módszer a Rect
argumentumként, amely tartalmazza azokat az ablakhatárokat, amelyekkel az alkalmazás elindul.
Ezután elindíthatja az alkalmazást a következővel startActivity(Intent, Bundle)
. Ha még nincs ActivityOptions
köteggel létrehozhat egyet ActivityOptions.makeBasic()
majd felhív setLaunchBounds()
a frissen létrehozott kötegen.
Vegye figyelembe, hogy alapértelmezés szerint, ha már van egy feladat az alkalmazáshoz az Áttekintés képernyőn, akkor Az Android egyszerűen átirányítja a meglévő (teljes képernyős) feladatra, amelyet korábban elindított a felhasználó. Mielőtt megpróbálná elindítani az alkalmazást egy szabad formájú ablakban, törölnie kell az alkalmazás összes feladatát az Áttekintés részben. (Azoknál az alkalmazásoknál, amelyeken belül elindulnak a tevékenységek standard
vagy singleTop
módban kényszeríthet egy új ablak megnyitását a Intent.FLAG_ACTIVITY_MULTIPLE_TASK
hívás előtt jelezze a szándéknak startActivity()
.)
Hogyan működik a szabad formájú mód a motorháztető alatt?
Van kiváló cikk írt, amely elmagyarázza, hogyan valósítható meg a több ablakos mód, beleértve a szabad formájú módot is az Android Nougatban. (MEGJEGYZÉS: a cikk kínai nyelven íródott, ezért feltétlenül futtassa a Google Fordítón keresztül)
Dióhéjban, a szabad formátumú alkalmazások a rendszer többi részétől külön veremben futnak (gondoljunk csak úgy: virtuális asztalra). Ezért nem futhatnak szabad formájú alkalmazások az indító vagy egy másik teljes képernyős alkalmazás tetején.
Szabad formájú módban futó alkalmazások (amelyeknek nincs android: windowIsFloating
igazra állítva) van a DecorCaptionView
a legfelső szint gyermekeként hozzáadva DecorView
. Ez a nézet tartalmazza a LinearLayout
az ablak feliratsávjának meghatározása az ablak mozgatásához, maximalizálásához és bezárásához. Bár személyesen nem ajánlom, a nézet elérése és testreszabása lehetséges a DecorView
segítségével Window.getDecorView()
, öntve a ViewGroup
majd hozzáfér a gyermeknézetekhez.
Minden olyan alkalmazás, amelyet úgy terveztek, hogy jól működjön az Android szabványos osztott képernyős többablakos módjában, szabad formájú módban is működik. isInMultiWindowMode()
igazat ad vissza a szabad formájú módban futó alkalmazásokhoz. Van néhány más nyilvánosan elérhető osztály és metódus, amelyet egy alkalmazás használhat, és amelyek kifejezetten a szabad formájú módhoz kapcsolódnak:
-
Window.setDecorCaptionShade()
: ezzel a módszerrel felülírható a feliratvezérlők (a maximalizálás és a bezárás gomb) árnyalata szabad formátumú alkalmazások esetén. -
Window.setRestrictedCaptionAreaListener()
: ezzel érzékelhető, ha egy ablak szabad formájú módban mozog. AWindow.OnRectrictedCaptionAreaChangedListener
minden alkalommal meghívódik, amikor a feliratvezérlők pozíciója megváltozik (amikor a felhasználó megmozgatja az ablakot), és megadja aRect
a feliratvezérlők új határaival. -
ActivityInfo.WindowLayout
: ez az osztály az alkalmazás jegyzékében deklarált információkat tartalmaz egy szabad formájú ablak kezdeti helyzetére vonatkozóan, amelyet az alkalmazás elindításakor kérhet. Például a következőket sorolhatja fel a jegyzékének címkéje:
Ezután, amikor az eszköz már szabad formájú módban van, és az alkalmazás elindul, ezekkel a megadott határokkal fog elindulni.android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
Példák a szabad formájú ablakmódra működés közben
2016 nyarán, amikor még fejlesztői előzetes volt az Android Nougat, kiadtam egy alkalmazást Tálca amely egy Windows-szerű startmenüt és a legutóbbi alkalmazások listáját kínálja egy rendszerfedvényben. Lehetővé teszi a Nougat felhasználóinak, hogy szabad formájú ablak módban indítsanak alkalmazásokat – és mivel a Tálca fedvényt használ, a képernyőn maradhat a szabad formájú ablakos környezetben. A Tálca és a szabad formájú mód kombinációja bármely Android-eszköznek, különösen a táblagépeknek PC-szerű érzést kölcsönöz.
tudsz letöltés Tálca a Google Playen, vagy nézze meg a forráskódot magad a GitHubon. A cikkben említett fogalmakon túlmenően bevetek néhány trükköt is, hogy a szabad formájú környezetet akkor is aktívan tartsam, amikor nem jelennek meg szabad formájú ablakok a képernyőn. A felhasználók opcionálisan beállíthatják a Tálcát alapértelmezett indítóként is, hogy eszközük automatikusan elindulhasson a szabad formájú környezetbe.
Mivel nincsenek olyan eszközök, amelyek hivatalosan az OEM által engedélyezett szabad formájú ablaktámogatással rendelkeznek (a jelen pillanatban), azt javaslom a Tálca használata eszközként a fejlesztők számára, hogy teszteljék alkalmazásaikat szabad formájú ablakos környezetben olyan eszközökön, amelyek egyébként nem támogatják azt.
A Tálca mellett az AOSP Launcher3 forráskódját is módosítottam, hogy lehetővé tegye az alkalmazások szabad formájú módba történő indítását. Ez az Android 7.1.1 készletindító egyszerű klónja, a minimális módosításokkal, amelyek lehetővé teszik a szabad formájú alkalmazások elindítását. Abban a reményben bocsátottam rendelkezésre ezt a módosított indítót, hogy más fejlesztők is támogatni fogják a szabad formájú ablakok elindítását egyéni indítóprogramjaikban. tudsz nézze meg a forráskódot a GitHubon, vagy tölts le egy minta APK-t.
Remélem, hogy az egyéni indítók fejlesztői használhatják ezt a kódot, és lehetővé teszik a szabad formátumú indítás támogatását ablakalkalmazások azoknak a felhasználóknak, akik nagyobb rugalmasságot szeretnének az ablakkezeléshez a nagy képernyőn eszközöket.