2011-06-19 18 views
13

Wszystkie różne rozdzielczości różnych produktów systemu Android doprowadzają mnie do szału.Jak obsługiwać różne rozdzielczości produktów z Androidem?

Moja pierwsza aplikacja na Androida, którą napisałem, została zaprojektowana tak, aby obsługiwała trzy najczęściej używane rozdzielczości: 240 x 320 (LDPI), 320 x 480 (MDPI) i 480 x 800 (HDPI). Format 480x854 nie zaszkodził układowi, ponieważ ma on tę samą szerokość co 480 x 800.

Ja również zakupione następujące urządzenia do testowania Moje aplikacje Android na: Samsung Galaxy Europie (LDPI) HTC Desire Z (HDPI)

szczęście moja dziewczyna ma HTC Wildfire S (MDPI), więc Większość rezolucji została omówiona.

Ale dziś mój brat pobrał moją aplikację na swoim nowym HTC Sensation, który ma jeszcze inną rozdzielczość 540x960 (HDPI?). Które nie wyświetlały mojej aplikacji tak, jak powinno i prawdopodobnie większość tabletów nie wyświetli jej poprawnie.

Co ja zrobiłem z moim pierwszym app został odczytany gęstość, a następnie ustawić parametry:

public void set_ui_parameters() { 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 

    if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){ 
     textSize = 35;  
     timeWidth = 80; 
     dayWidth = 110; 
     moneyWidth = 50; 
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){ 
     textSize = 35;  
     timeWidth = 53; 
     dayWidth = 73; 
     moneyWidth = 33; 
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_LOW){ 
     textSize = 28; 
     timeWidth = 40; 
     dayWidth = 55; 
     moneyWidth = 25; 
    } 
} 

Poza parametrami Ja również tworzonych kanału alfa dla LDPI, MDPI i HDPI. Działa to dobrze dla rozdzielczości opisanych powyżej, ale zależy to od rozdzielczości ekranu i.c.w. rozmiar ekranu i kończy się niepowodzeniem, na przykład HTC sensatoin z 540x960.

Wiem, że nie wszystkie rezolucje są używane tak często, ale chciałbym wesprzeć jak najwięcej osób. Stats of Screen Sizes and Densities

Wiele razy czytałem Supporting Multiple Screens, ale nie znalazłem jednoznacznej odpowiedzi na ten "problem".

Czy powinienem więc odczytać rozdzielczość i ustawić parametry zgodnie z rozdzielczością zamiast gęstością? Czy to jest mądra rzecz, czy jak sobie z tym radzisz?

Wielkie dzięki za informacje!

Odpowiedz

27

Nie musisz tego robić, aby obsługiwać różne gęstości. Należy utworzyć różne foldery zasobów:

res/values-ldpi/dimens.xml 
res/values-mdpi/dimens.xml 
res/values-hdpi/dimens.xml 

Następnie system Android zdecyduje, którego pliku użyć. Można mieć coś takiego:

<!-- in values-ldpi/dimens.xml --> 
<dimen name="textSize">25dip</dimen> 

i ..

<!-- in values-mdpi/dimens.xml --> 
<dimen name="textSize">20dip</dimen> 

etc. i nie powinien dbać o rozdzielczości ... istnieje wiele różnych rozdzielczościach rozmiarach, tak byłoby piekło podejmować decyzje w oparciu o to.

Ponadto, jeśli używasz dp zamiast pikseli, prawie nigdy nie będziesz musiał tworzyć plików o różnych wymiarach dla każdej gęstości. Oczywiście, czasami trzeba, ale to zależy od aplikacji.

+0

Dzięki tym wartościom jest bardzo użyteczny, ale nie rozwiązuje to problemu z rozdzielczością 540x960 lub jestem w błędzie. Ponieważ SQRT (540^2 + 960^2) /4,3 = 256,15 (HTC Sensation) jest mniej więcej taki sam jak SQRT (480^2 + 800^2)/3,7 = 252,15 (HTC Desire Z) i oba będą być indeksowane jako HDPI, gdzie ekran sensacji jest szerszy o 60 pikseli. – patrick

+2

Tak ... Problem polega na tym, że nie będziesz w stanie obsłużyć 100% rozmiarów ekranu. Na przykład ... jeśli chcesz, aby widok tekstowy obejmował dokładnie szerokość ekranów, nawet jeśli zastosujesz wszystkie możliwe techniki, pojawi się kilka urządzeń, które zawiną tekst lub coś takiego. Chodzi mi o to, że nie możesz sprawić, by wyglądała dokładnie tak, jak chcesz na wszystkich urządzeniach ... musisz się dostosować, aby wyglądała jak najlepiej. – Cristian

0

Teraz jestem po prostu zgadywania tutaj ponieważ reszta wykonania nie jest pokazany, ale jestem przy założeniu używasz tych pomiarów oblicza się px

Spójrz na dp. To w zasadzie robi wszystkie te rzeczy, które zrobiłeś automatycznie na każde urządzenie.(Niezależny piksel urządzenia)

0

Nie martw się nieznaczną różnicą w rozdzielczości: 540 x 960 jest tylko nieco większy niż 480 x 800. Dodatkowa przestrzeń pionowa jest łatwa: daje więcej miejsca na listy. W przypadku przestrzeni poziomej, o ile prawidłowo obsługujesz układy, po prostu masz po bokach dodatkowe obicie (30pix ea).

Niestety, obrazy o pełnej szerokości (480 szerokości) są nieco większym problemem. Jeśli chcesz uzyskać doskonałe obrazy w pikselach, możesz użyć wartości scaleType = "center", aby obraz nie był skalowany. Jeśli chcesz mieć pełną szerokość, możesz użyć scaleType = "fitCenter", aby go wypełnić. To będzie trochę niewyraźne ... ale tak wiele na Androida to :-)

0

Wpadłem też na ten problem, z tym wyjątkiem, że moja aplikacja to gra, w której jest jedno płótno SurfaceView, które rysuję obrazy tła i sprite'y na (podobny do przykładu LunarLander).

Sposób, w jaki sobie z tym poradzisz, polega na rozszerzeniu obrazu tła do największego rozmiaru, który chcesz wspierać (540 x 960), ale zachowujesz wszystkie ważne rzeczy (takie jak przyciski, tekst, informacje itp.) W mniejszym prostokącie. 480 x 800. Możesz sam powiększyć obraz lub po prostu dodać obramowanie. Kluczem jest to, że nie ma nic ważnego.

Osoby z telefonami 480 x 800 zobaczą Twoją normalną aplikację. Osoby z telefonami 540 x 960 zobaczą trochę dodatkowej granicy.

1

Jedyne, co musisz zrobić, to ustawić Android: minSdkVersion na 7 lub wyższy w pliku manifestu. Jest możliwe, że niektóre widoki będą wyglądały nieco inaczej, ale aplikacja ma zastosowanie na całym ekranie.

Powiązane problemy