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-hdpi
drawable-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"
.
Ciekawe, czy możesz dostarczyć nam SS, który pokazuje różnice (wiem, że to może być trudne, gdy pracujesz nad projektem)? – Warpzit
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
Musimy wiedzieć, "co wygląda inaczej" dokładnie, aby ci pomóc. –