Jaka jest różnica między -anydpi a -nodpi?

108

Jeśli używasz kreatora Vector Asset w Android Studio 1.5.0, każdy plik XML do rysowania wektorowego, który importujesz za pomocą tego kreatora, trafia do pliku res/drawable/.

Jednak build/katalog i wynikowy plik APK pokazują, że te pliki XML są przenoszone do res/drawable-anydpi-v21/katalogu zasobów. Ta -v21część ma sens, ponieważ VectorDrawablejest obsługiwana tylko na poziomie API 21+. Jednak -anydpiwydaje się , że nie jest udokumentowany. Spodziewałbym się -nodpi, zarówno dla pierwotnego miejsca docelowego importu, jak i miejsca, w którym system kompilacji zdecyduje się go przenieść.

Czy ktoś widział oficjalne oświadczenia dotyczące tego -anydpi, co oznacza iz czym jest związek -nodpi? Szukam praktycznych efektów, a nie tylko tego, co podpowiadają niektóre komentarze do kodu.

CommonsWare
źródło

Odpowiedzi:

106

nodpi

Są to zasoby niezależne od gęstości. System nie skaluje zasobów oznaczonych tym kwalifikatorem, niezależnie od gęstości bieżącego ekranu.

Na przykład:

  • drawable- nodpi /dot.png

Kropka będzie mała na xxhdpi, duża na ldpi.

Jednak program rozpoznawania zasobów będzie pasował do określonego kwalifikatora, jeśli istnieje.

Na przykład

  • do rysowania- hdpi /eg.png
  • drawable- nodpi -v21 / np. xml

Na urządzeniu HDpi Lollipop (API 21) używana jest mapa bitowa .

W urządzeniu Lollipop (API 21) xhdpi używany jest wektor.

anydpi

Te zasoby mają pierwszeństwo w każdej rozdzielczości.

Na przykład

  • do rysowania- hdpi /eg.png
  • drawable- anydpi -v21 / np. xml

Na urządzeniu HDpi Lollipop (API 21) używany jest wektor .

W urządzeniu Lollipop (API 21) xhdpi używany jest wektor.

Odniesienie

Uwaga : dodano anydpi w zmianie Ic3288d0236fe0bff20bb1599aba2582c25b0db32 .

rds
źródło
To nie jest to, co widzę. Cytując moją nagrodę: „Biorąc pod uwagę dwie edycje tego samego zasobu w res / drawable-nodpi / i res-drawable-mdpi /, otrzymuję res / drawable-nodpi / edition na Nexusie 5 z Androidem 6.0, czyli -xxhdpi urządzenie". Czy masz przykładowy projekt, który demonstruje cytowane przez Ciebie zachowanie?
CommonsWare
To dlatego, że użyłeś drawable. Zachowanie SDK mogło ulec zmianie. Zobacz VectorDrawable: Android ładuje pliki PNG w formacie xhdpi zamiast zasobu wektorowego
rds
„To dlatego, że użyłeś rysunków” - tak samo jak w Twojej odpowiedzi. Każdy katalog zasobów, który cytujesz w swojej odpowiedzi, jest drawablekatalogiem zasobów, tak jak oba katalogi, które zacytowałem w mojej nagrodzie, są drawablekatalogami zasobów.
CommonsWare
„Na xxxdpi, framework zajmie bitmapę hdpi”. - to właśnie się nie dzieje, chociaż moje testy są na -xxhdpiurządzeniu. Mam res/drawable-mdpi/nodpi_and_m.pngi res/drawable-nodpi/nodpi_and_m.xml. Na urządzeniu Nexus 5 -xxhdpiużywany zasób to res/drawable-nodpi/nodpi_and_m.xml. Zgodnie z twoim algorytmem i moimi oczekiwaniami res/drawable-mdpi/nodpi_and_m.pngpowinien być używany. To nie jest to, co się dzieje.
CommonsWare
2
Konkluzja: powinieneś umieścić wektory w drawable-anydpi-v21. Jeśli masz bibliotekę do rysowania wektorów nośnych, możesz ją umieścić w drawable-anydpilub po prostu drawable.
rds
17

Kod źródłowy zawiera następujące uwagi (linia 639):

/**
 * Value for {@link #densityDpi} for resources that scale to any density (vector drawables).
 * {@hide}
 */
public static final int DENSITY_DPI_ANY = 0xfffe;

/**
 * Value for {@link #densityDpi} for resources that are not meant to be scaled.
 * {@hide}
 */
public static final int DENSITY_DPI_NONE = 0xffff;

Mam nadzieję, że to usunie zamieszanie.

Vishavjeet Singh
źródło
8
„Mam nadzieję, że to rozwiąże zamieszanie” - raczej nie. Nie jest jasne, jaka jest różnica między „skalą do dowolnej gęstości” a „nieprzeznaczonym do skalowania” w praktyce. Elementy do rysowania w -nodpikatalogach z pewnością są skalowane w oparciu o rozmiar, zgodnie z wszelkimi regułami dotyczącymi tego, jak używany jest element do rysowania.
CommonsWare
„Nie przeznaczone do skalowania” oznacza, że ​​nie będą skalowane bez względu na to, co zrobi programista lub jaka jest gęstość.
Vishavjeet Singh
Myślę, że przez wyrażenie „skaluj do dowolnej gęstości” mają na myśli to, że odnoszą się do elementów rysunkowych wektorowych, które będą skalowane tak, aby pasowały do dowolnej gęstości, bez względu na to, jak duża jest gęstość.
Vishavjeet Singh
3
został dodany na android.googlesource.com/platform/frameworks/base/+/31245b4%5E! iz niego można się dowiedzieć, że prawdopodobnie naprawiono jakiś błąd 17007265
marcinj
1
@ MarcinJędrzejewski: Właściwie to „są wybierane jako najlepsze dopasowanie, chyba że istnieje konfiguracja, która dokładnie pasuje do żądanej gęstości”. Komentarz do tego zatwierdzenia daje mi wskazówkę. Dzięki!
CommonsWare
10

nodpi: Zasoby dla wszystkich gęstości. Są to zasoby niezależne od gęstości. System nie skaluje zasobów oznaczonych tym kwalifikatorem, niezależnie od gęstości bieżącego ekranu.

anydpi: Ten kwalifikator pasuje do wszystkich gęstości ekranu i ma pierwszeństwo przed innymi kwalifikatorami. Jest to przydatne w przypadku rysunków wektorowych. Dodano na poziomie API 21.

dzikovskyy
źródło
9

Używam drawable-nodpi do wszystkiego, łącznie z dużą ilością dużych grafik do mojej gry. Jedną z nieudokumentowanych konsekwencji skalowania grafiki w górę jest wykładniczy wzrost zużycia pamięci. Więc jeśli masz grafikę o wielkości 1 MB do rysowania, zostanie ona przeskalowana do 4 MB, 16 MB lub 64 MB w zależności od rozdzielczości urządzenia użytkownika. A rozdzielczości urządzeń stale rosną. To skalowanie w rzeczywistości nie zwiększa oczywiście ostrości grafiki. Czynności związane z rysowaniem mogą i tak wskazywać, jak duża powinna być każda grafika w stosunku do rozmiaru ekranu, bez potrzeby nadmuchiwania aplikacji wieloma folderami rysowania.

Androidcoder
źródło
3
niedoceniana odpowiedź. Napotkałem ten sam problem: miałem obraz o rozmiarze 100 KB, ale często występowały błędy OOM podczas ładowania. Aplikacja uległa awarii, informując, że nie może przydzielić 18 MB !!! Nie mogłem zrozumieć, jak te 100 KB można zamienić na 18 MB, ale tak naprawdę było to wynikiem skalowania. Przełączenie obrazu na brak rozdzielczości rozwiązało problem.
Simon Ninon,