2012-10-31 14 views
15

Zajmuję się tworzeniem aplikacji dla tabletów 7-calowych Kindle Fire HD i Nexus 7. Te dwie aplikacje mają ten sam rozmiar i tę samą rozdzielczość ekranu. Jednak uruchamiam moją aplikację, jest zupełnie inaczej. Czemu?Nexus 7 i Kindle Fire HD, myślę inaczej

Wygląda na to, że nexus 7 został wykryty jako TVDPI, a Kindle Fire HD to HDPI. Jak uzyskać to samo renderowanie na podstawie modelu 1280 * 800?

Dziękuję

+0

Ciekawe, czy możesz dostarczyć nam SS, który pokazuje różnice (wiem, że to może być trudne, gdy pracujesz nad projektem)? – Warpzit

+0

Czy Nexus7 wyświetla aplikację, ponieważ powinny to być domyślne układy? [Ed Burnette] (https://plus.google.com/106300001086744879268/posts/Wa9xtQjZHJx) mówił o problemie dotyczącym rozdzielczości TVDPI, a zwłaszcza Nexus7. Domyślam się, że Nexus zamiast tego otrzymuje domyślny układ. – Korcholis

+0

Musimy wiedzieć, "co wygląda inaczej" dokładnie, aby ci pomóc. –

Odpowiedz

25

Cóż, wydaje się, że już odkrył, dlaczego dwa mają różnice, to dlatego zgłosić one różne współczynniki skali gęstość:

  • Nexus 7: TVDPI: Scale Factor = 1,333
  • Kindle Fire HD: HDPI: Współczynnik skali = 1,5

Dlaczego więc przedstawiają one inaczej, gdy technicznie mają ten sam rozmiar fizyczny i rozdzielczość?

Problem CORE istnieje, ponieważ jedno urządzenie to urządzenie Google Play (Nexus), a drugie nie (Kindle). Wszystkie urządzenia z Androidem, które mają Google Play (i inne aplikacje Google), mogą to zrobić, przekazując coś, co nazywa się pakietem testów zgodności (CTS), który sprawdza, czy ustawienia takie jak te są zgodne ze standardami, które przedstawiły. Same standardy są dokumentowane w dokumencie definicji kompatybilności (CDD) dla każdego wydania. Here is a link to the CDD for Android 4.0 (Część 7.1 dotyczy rozmiaru ekranu i gęstości). CDD mówi producentowi urządzenia, że ​​powinien podać współczynnik skali, który jest liczbowo najbliższy rzeczywistemu DPI, czyli w rzeczywistości jest to TVDPI.

Urządzenia Amazon nie używają żadnych aplikacji Google, w tym Google Play. Chociaż może to być w ich najlepszym interesie przestrzeganie tych samych standardów, nie są nimi związani, a często nie są przestrzegane. TVDPI niby podskoczył na wszystkich, gdy pojawił się na Nexusie 7, ale Amazon wiedziałby o tym, gdyby odwołali się do CDD podczas projektowania.

Jak to powoduje, że zachowują się inaczej?

Różnice nie są w wyborze układu. Oczywiście z twoich zrzutów ekranu oba urządzenia zbierają odpowiedni układ, zgodnie z oczekiwaniami. Zmiana wartości sw w katalogu układu wpływa tylko na to, które urządzenia wybierze ten układ ... nie zmienia to nic na miarę tego, jak rzeczy będą skalowane. Nie przejmuj się próbą umieszczania układów w katalogach o gęstej gęstości ... układy powinny być elastyczne.

Zamiast tego problem polega na obliczeniu wymiarów lub wielkości wykonanych na niezależnych od gęstości jednostkach pikseli (np. Dip lub dp), takich jak rozmiary tekstu, dowolne ustalone rozmiary widoku, które można utworzyć, i rozmiary do rysowania.

Ponieważ te dwa urządzenia mają wybrane w celu skalowania zasobów w różny sposób, każdy pobrany zasób używany lub dowolna wartość zdefiniowana w "dp" spowoduje niewielką zmianę.Pozwolę sobie podać dwa przykłady:

Definiujesz rozmiar tekstu dla TextView na 16dp. Na Nexusie 7 narysuje tekst na poziomie 21 pikseli. Kindle Fire HD narysuje ten sam tekst przy 24px. Różnica jest niewielka ... ale istnieje.

To samo dotyczy rysowanych obrazów. Jeśli zdefiniowałeś tylko obraz w formacie drawable-mdpi na 48x48 i ten sam obraz w drawable-hdpi w 72x72, Kindle ma obraz 72px do bezpośredniego użycia, a Nexus utworzy obraz w skali 64px, więc różnica między tymi dwoma zasobami wynosi 8 pikseli .

Co mogę zrobić, aby wyglądały bardziej podobnie?

W większości przypadków powiedziałabym, że nie powinieneś. Zazwyczaj skalowanie nie ma większego wpływu na wynik aplikacji, chyba że ograniczenia układu są ustawione ze zbyt dużą liczbą zakodowanych rozmiarów.

Generalnie jednak, jeśli istnieją części twojego interfejsu użytkownika, które musisz specjalnie zmienić w tym celu, rozwiązaniem jest zdefiniowanie konkretnych zasobów i wymiarów dla przypadku, gdy uważasz, że są one wymagane (ponownie, nie chciałbym Zalecamy przeskalowanie WSZYSTKIEGO w Twojej aplikacji, aby sprostać temu przypadkowi).

W przypadku elementów takich jak rozmiar tekstu lub widoku oznacza to, że użytkownik może potrzebować pliku values-tvdpi/dimensions.xml i domyślnego pliku values/dimensions.xml. Korzystając z powyższego przykładu, możesz zdefiniować domyślny rozmiar tekstu jako 16dp, ale w lokalizacji -tvdpi zdefiniuj ten sam wymiar co 18dp. Spowoduje to, że oba urządzenia przeskalują ostateczny tekst do 24 pikseli. W kodzie, w którym używany jest rzeczywisty wymiar, należy go podać bezpośrednio jako @dimen/myTextSize, a nie jako 16dp.

Dla rozciągliwych elementów, dodać katalog drawable-tvdpi i skala tych aktywów, aby dopasować jak myślisz powinni zwrócić na urządzeniach takich jak Nexus 7. Ponownie z naszym poprzednim przykładzie, skopiuj ten sam plik obrazu z folderu do folderu drawable-hdpidrawable-tvdpi więc oba urządzenia będą narysować ten sam obraz przy 72px.

Aby uniknąć kopiowania tego samego zasobu w wielu miejscach, można to również zrobić w przypadku aliasingu. Umieszczanie samego obrazu na drawable/ ze specjalną nazwą i używanie values-tvdpi/drawables.xml i values-hdpi/drawables.xml do odniesienia do pojedynczego zasobu w dwóch miejscach. Więcej informacji na temat aliasingu, see this documentation. Przykłady dotyczą układów, ale ten sam paradygmat działa dla rysunków (lub dowolnego zasobu), przechodząc na type="drawable".

+3

To jest świetna odpowiedź, jedynym zastrzeżeniem, które dodaję, jest to, że aliasing oparty na gęstości jest jedynie tymczasową poprawką. Kiedy wyjdzie tablet zgodny z CDD i naprawdę HDPI, wszystkie powyższe zostaną przerwane. To jest ta sama sytuacja, co w przypadku Galaxy Tab 7. "Zgłoszono to jako HDPI, kiedy był to naprawdę MDPI. Wszyscy byli aliasowi, aby działało, ale kiedy Nexus 7" wyszedł, wszystkie hacki zostały ujawnione, a większość firm musiała spaść wsparcie dla Tab 7 "w celu obsługi nowej linii urządzeń o wyższej rozdzielczości. Obecnie pochylam się nad nowymi układami, które używają -sw533dp, ale nadal nie jestem zadowolony. – JustinMorris

1

Ponieważ Nexus7 jest urządzeniem tvdpi wykorzystuje aktywa układu-sw600dp (na podstawie obliczeń na 213dpi), przy czym FireHD jest urządzeniem HDPI i kończy się przy użyciu zasobów układu-sw533dp (obliczenia na podstawie 240dpi)

+3

dlaczego? gęstość jest obliczana przez piksele/cal, oba urządzenia mają tę samą rozdzielczość, oba urządzenia mają ten sam rozmiar ekranu, więc dlaczego jest różnica gęstości? – stoefln

1

Może powinieneś użyć layout-tvdpi i layout-hdpi?

Powiązane problemy