Podrška za različite ekrane na Android platformi

Objavila u 09/11/2010 u 8:03

dip

Često se spominje da razvoj za Android nije toliko lak najviše iz razloga što je neophodno podržati što više različitih telefona (uređaja). Od proizvođača do proizvođača i od modela do modela se razlikuje veličina ekrana telefona i njegova rezolucija kao i ostale hardverske karakteristike. Kada se kreira aplikacija za Android uređaj, poželjno je da se napravi tako da je nezavisna od veličine ekrana na kojem se koristi. Tako da bi ovo bio mali uvod u to kako Android platforma vidi različite veličine ekrana.

“Veličinu ekrana” definiše:

Screen size – aktuelna fizička veličina ekrana (meri se u  inčima po dijagonali). Postoje tri generalizacije: large, normal i small. Aplikacije se prave za ove generalizacije.

Aspect ratio – odnosi se na proporciju visine i širine ekrana i tu Android platforma definiše kvalifikatore: long i notlong.

Resolution – predstavlja ukupan broj fizičkih piksela na ekranu. Kod Android platforme rezolucija nije definisana preko visine i širine i ne daje informaciju o proporcijama, tako da aplikacije ne rade direktno sa rezolucijama.

Density – bazira se na rezoluciji ekrana i to je gustina rasporeda fizičkih piksela po visini i širini ekrana. Ekrani sa manjom gustinom (lower density) imaju značajnije manje piksela po istoj dužini ekrana od onih sa visokom gustinom (higher density). Od gustine piksela direktno zavisi veličina elemenata na ekranu, na nižoj gustini elementi su krupniji. Android platforma i ovde ima tri generalizacije: hdpi (high), mdpi (medium), i ldpi (low) za koje se kreiraju aplikacije.

Screen Sizes

Density-independent pixel (dip) – Virtuelna jedinica piksela koju aplikacije mogu da koriste za definisanje veličine i pozicije elemenata korisničkog interfejsa, sa ciljem prikazivanja elemenata na isti način, nezavisno od veličine ekrana (gustinski nezavisno – density-independent). DIP je ekvivalentan fizičkom pikselu na ekranu sa 160 dpi-a. Platforma se brine o skaliranju jedinica dip-a u zavisnosti od ekrana i njegove gustine (density).Konverzija između piksela i dip-a se računa na osnovu ove formule: pixels = dips * (density / 160), iz toga sledi da je za ekran sa 240 dpi-a, 1 dip  jednak 1.5 fizički piksel.

Grafički prikaz kako se na Android platformi poredi i generalizuje fizička veličina ekrana u inčima sa aktuelnom gustinom ekrana u dpi-ma:

Screen Ranges

Kreiranje aplikacija tako da su nezavisne od veličine ekrana možemo izvesti na više načina:

Može se kreirati konačni interfejs, ikone, slike i kompletni izgled za svaku generalizovanu veličinu i gustinu (density). Tako bi recimo u vašem Android projektu u folderu res trebali imati layout folder u kojem čuvate podešavanja za normal veličinu i dodatna dva layout foldera  za small i large. Pored toga u res folderu imate i drawable folder  i možete dodati još dva foldera: drawable-ldpi i drawable-hdpi ko će sadržati slike sa različitim gustinama.

res/layout/layout.xml

res/layout-small/layout.xml

res/layout-large/layout.xml

res/drawable-mdpi/ikona.png

res/drawable-ldpi/ikona.png

res/drawable-hdpi/ikona.png

Preporuka je da razvijate aplikaciju hdpi i large veličinu ekrana. Pa tako slike za hdpi treba da budu veće 1.5 puta u odnosu na mdpi, dok slike za ldpi treba da budu manje 0.75 puta od mdpi. Tako na primeru ako imate ikonicu 48×48 PNG za mdpi, onda bi za hdpi ta ikonica bila 72×72 a za ldpi 36×36.

U Android SDK 1.6 postoji novi element <support-screen> tag u manifestu. Ovim tagom saopštavamo koliko različitih veličina ekrana podržava aplikacija: android:smallScreens, android:normalScreens, android:largeScreens i android:anyDensity.

Parčence manifesta može izgledati ovako:

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”>

<supports-screens

android:largeScreens=”false”

android:normalScreens=”true”

android:smallScreens=”true”

android:anyDensity=”true” />

</manifest>
Ovde smo rekli da naša aplikacija ne podržava velike (large) ekrane postavljajući vrednost false, a podržava normal i small ekrane gde smo podesili vrednost true.

Što se tiče android:anyDensity parametra njega tumačimo na sledeći način:

Ukoliko se postavi na true, ignoriše se Androidov interni način za upravljanje gustinama (density), i govorimo sistemu da mi želimo da upravljamo veličinama ikonica i njihovim gustinama. Pa smo stoga morali da napravimo drawable foldere i njihove elemente.

Ukoliko se postavi na false, Android platforma sama upravlja gustinama (density). U ovom slučaju Android automatski skalira ikonice i elemente dajući im gustinu ekrana.

Drugi, optimizovaniji način za izradu aplikacija na Android platformi za različite uređaje, vezuje se za veličinu dip (Device Independent Pixels) koju treba koristiti umesto px (piksela) prilikom kreiranja elemenata:

Na primer:

<Button android:id=”@+id/myButton”

android:layout_width=”10px”

android:layout_height=”10px”

android:layout_gravity=”center”

android:textStyle=”bold” />


Umesto px koristimo dip:

android:layout_width=”10dip”

android:layout_height=”10dip”


Na ovaj način uz auto skaliranje bi elementi trebali da se automatski smanjuju i povećavaju kao i pozicioniraju na različitim uređajima, pošto se koristi virtuelna jedinica piksela – dip.

Potrebno je u manifestu podesiti atribut android:anyDensity na false.

Neophodno je i prilikom kreiranja interfejsa oslanjati se na relativeLayout a ne na absoluteLayout. AbsoluteLayout se oslanja na fiksne vrednosti pozicioniranja i veličine elemenata na ekranu, što ume da načini zbrku na različitim uređajima. Dok ukoliko koristite relativeLayout elementi na ekranu će se pozicionirati jedan u odnosu na drugi. Samim tim će se bolje ponašati na različitim uređajima.

Testiranje aplikacija možete izvršiti u emulatoru tako što ćete napraviti različite AVD (Android Virtual Devices) za različite veličine i gustine ekrana.

Detaljnije o svemu ovom možete pogledati na developer.android.com

Postoje i aplikacije koje omogućavaju da menjate gustinu ekrana kao što je LCD Density

Tags: aplikacijadensitydpiekranpikselpodrškauređaj

Autor
goldie Zlata Milošević

Objavljenih tekstova: 883

Devojka u gik svetu (giketa) se retko viđa, pogotovo kada je pri tom developer i preduzetnica. Poznatija je na Twitteru kao @kremasica, a možete je pratiti i na Instagramu: goldie021. Mi imamo čast da nam je ona jedan od autora na ovom sajtu. Posle HTC Desire, Sony Ericsson Xperia arc-a i Nexus-a 4, Nexus 5, LG G3, Nexus 6P a sada je vlasnica Google Pixel 2XL telefona. Voli da čita zanimljive vesti i da ih deli sa drugima. (napisao: eboye)

Pošalji odgovor

Your email address will not be published. Required fields are marked *