MareX WeBlog

Tasker - detekce rozlišení a poměru stran displeje

REKLAMA

Pokud tvoříte aplikace v Taskeru, nebo jen projekty, které zveřejňujete ke stažení jiným uživatelům a viděli jste někdy scénu, která se na Vašem telefonu zobrazila normálně, na přístroji s jiným rozlišením (nebo spíše s jiným poměrem stran) displeje, určitě jste si všimli, že se nezobrazila až tak dobře jako na tom Vašem. Proč?

Jak fungují scény v Taskeru

Scéna se musí na daném zařízení zobrazit tak, aby se na displej vešla celá a co nejlépe využila plochu displeje. Toto se týká pouze scén zobrazovaných jako

  • Overlay, Blocking, Full Display
  • Activity, Full Window
  • Activity, Full Display
  • Activity, Full Display, No Title

Jak fungují dialogy a ostatní Overlay, nevím. Pro nás je asi nejlepší použít Overlay, Blocking, Full Display, nebo Activity, Full Display, No Title, protože zde nám scéna zabírá opravdu celou plochu displeje (s výjimkou situací, kdy máme na displeji SW tlačítka). U zbývajících dvou se na displej ještě musí vejít notifikační lišta a v případě Activity, Full Display navíc titulek okna (který navíc na MIUI bývá podstatně širší než na jiných modifikacích) a proto by se nám velikost scény špatně počítala.

Pokud se scéna zobrazí na jiném displeji, zabere celou jeho plochu, ovšem ne tak elementy v ní umístěné. Nejlepší je to vysvětlit na příkladu.

Na mém telefonu (rozlišení 480×800) lze v UI Taskeru vytvořit scénu o maximálních rozměrech 474×695. To proto, že nějakou část displeje v editoru scén zabírá spodní lišta s tlačítky a nahoře úzký titulek. Nastavím této scéně pozadí na černou barvu a vytvořím v ní element se zelenou barvou pozadí a tento element roztáhnu na celou plochu scény, bude tedy mít stejné rozměry jako samotná scéna. Na následujících obrázcích vidíte, jak se taková scéna zobrazí na displejích s různým rozlišením. Jako první je 480×800, druhý 720×1280 a poslední 320×480.

Jak vidíte, nevypadá to ideálně. Scéna se sice roztáhne přes celou plochu displeje, ale element v ní umístěný se roztáhne jen tak, aby zůstal zachován jeho poměr stran.

Co s tím poprvé

Pokud víme, že se scéna bude zobrazovat pouze na jedné velikosti displeje, stačí nám scénu exportovat, poté upravit v Taskerem vygenerovaném XML souboru scény její velikost a velikosti a pozice jednotlivých elementů a naimportovat zpět do Taskeru. Jenže tohle nám stačí pouze v případě, že budeme náš projekt (aplikaci) používat maximálně na vlastním telefonu.

Co s tím podruhé

Budeme-li chtít naši aplikaci sdílet veřejně, nezbude nám nic jiného, než takových scén vytvořit několik, protože nikdy nevíme, na jakých rozměrech displeje bude používána. Ale nebojte se, nemusíte tvořit scény ve všech možných rozlišeních, stačí vytvořit scény pro nejpoužívanější poměry stran displejů. A těch je asi šest:

  • 16:9
  • 16:10
  • 5:3
  • 5:2
  • 4:3
  • 3:2

Protože jak jsme si už řekli, scéna se displeji přizpůsobí tak, aby zůstal zachován právě poměr stran.

Ještě bych chtěl podotknout, že je úplně nejlepší používat scénu pouze s jedním elementem WebView a veškeré grafické rozhraní tvořit v HTML a JavaScriptu, protože ručně upravovat XML soubor scény obsahující hromady elementů nebude žádná sranda.

Scénu je dobré vytvořit v takové velikosti, abyste ji mohli pohodlně upravovat na svém telefonu. Pokud totiž vytvoříte scénu větší, než Vám dovoluje editor scén v Taskeru, nepůjde Vám v tomto editoru upravovat. Například, jak už jsem psal, na mém telefonu lze v editoru vytvořit scénu o maximální velikosti 474×695, pokud budu chtít vytvořit scénu pro rozlišení 720×1280 (tedy 9:16, právě 16:9), udělám ji 387×688 – má poměr stran 16:9 a tedy se rozlišení 720×1280 krásně přizpůsobí.

Zjištění poměru stran displeje

Hlavním účelem tohoto článku je nabídnout Vám projekt do Taskeru, který zjistí rozlišení a poměr stran displeje. Projekt je to proto, že obsahuje dvě scény, pomocí nichž zjištění rozlišení probíhá, samotný Task by na to nestačil.

Dříve mi fungovalo klasické screen.width a screen.height v JavaScriptu, ale nyní mi toto vrací nuly. Nevím, jestli je to verzí Androidu nebo Taskeru, každopádně když to nefunguje vždy a všude, je to k ničemu. Proto jsem se uchýlil k detekci pomocí scén (nápad Daniela).

Celá detekce probíhá tak, že se spustí nejprve jedna scéna, zjistí se velikost elementu a scéna se zavře, to samé se provede s druhou scénou. Pak následuje jednoduchý JavaScript, který ze získaných údajů vypočítá rozlišení a poměr stran displeje. Toto celé trvá nějakých 500 milisekund, tedy asi půl vteřiny, takže uživatel by si toho asi ani nevšiml, kdyby mu dvakrát rychle za sebou nezmizela a znovu se neobjevila notifikační lišta.

Výsledkem jsou 4 globální proměnné:

  • %DEV_DISPLAY_RES_PORTRAIT – obsahuje rozlišení v režimu na výšku (např. 480×800)
  • %DEV_DISPLAY_RES_LANDSCAPE – obsahuje rozlišení v režimu na šířku (např. 800×480)
  • %DEV_DISPLAY_ASP_RATIO – obsahuje poměr stran (klasicky na šířku) (např. 5:3)
  • %DEV_DISPLAY_RATIO_TEXT – to samé jako %DEV_DISPLAY_ASP_RATIO ovšem bez dvojtečky (např. 53) – tuto hodnotu je možné použít například v názvu scény, abyste na základě poměru stran spustili tu správnou

Problém může nastat na přístrojích, které mají SW tlačítka (Galaxy Nexus), kde Vám to vrátí rozlišení po odečtení velikosti této lišty (díky Luďkovi za upozornění). Pak budete muset použít nějakou výchozí scénu, což samozřejmě budete muset udělat ve všech případech, kdy bude detekován poměr stran, se kterým jste nepočítali.

Pozor: scény, které projekt obsahuje, neotevírejte! Pokud je totiž potom zavřete kliknutím na zelenou fajfku, tak i přesto, že neprovedete žádné změny, se změní jejich velikost a nejspíš Vám to celé bude fungovat špatně. Scény mají rozlišení 200×4000 a 4000×200 bodů a mělo by to tak zůstat.

Projekt ke stažení: Disp_Asp_Ratio_Detect.prj.xml

REKLAMA

Tasker - detekce rozlišení a poměru stran displeje