Apa Perbedaan Antara -anydpi dan -nodpi?

108

Jika Anda menggunakan wizard Vector Asset di Android Studio 1.5.0, XML drawable vektor apa pun yang Anda impor menggunakan wizard tersebut akan masuk res/drawable/.

Namun, build/direktori, dan APK yang dihasilkan menunjukkan bahwa file XML tersebut dipindahkan ke res/drawable-anydpi-v21/direktori resource. Bagian ini -v21masuk akal, karena VectorDrawablehanya didukung di API Level 21+. Namun, -anydpisepertinya tidak terdokumentasi. Saya akan berharap -nodpi, baik untuk tujuan impor asli dan di mana sistem build memilih untuk memindahkannya.

Adakah yang pernah melihat pernyataan resmi untuk apa -anydpiartinya, dan dengan apa hubungannya -nodpi? Saya mencari efek praktis, bukan hanya apa yang diisyaratkan oleh beberapa komentar kode.

CommonsWare
sumber

Jawaban:

106

nodpi

Ini adalah resource yang tidak bergantung kepadatan. Sistem tidak menskalakan resource yang diberi tag qualifier ini, terlepas dari kepadatan layar saat ini.

Misalnya:

  • drawable- nodpi /dot.png

Titik akan tampak kecil pada xxhdpi, besar pada ldpi.

Namun, pemecah sumber daya akan cocok dengan kualifikasi tertentu jika ada.

Misalnya

  • drawable- hdpi /eg.png
  • drawable- nodpi -v21 / eg.xml

Pada perangkat hdpi Lollipop (API 21), bitmap digunakan.

Pada perangkat Lollipop (API 21) xhdpi, vektor digunakan.

anydpi

Sumber daya ini diutamakan dalam dpi apa pun.

Misalnya

  • drawable- hdpi /eg.png
  • drawable- anydpi -v21 / eg.xml

Pada perangkat hdpi Lollipop (API 21), vektor digunakan.

Pada perangkat Lollipop (API 21) xhdpi, vektor digunakan.

Referensi

Catatan : anydpi telah ditambahkan dalam perubahan Ic3288d0236fe0bff20bb1599aba2582c25b0db32 .

rds
sumber
Bukan itu yang saya lihat. Mengutip bounty saya: "Diberikan dua edisi sumber daya yang sama di res / drawable-nodpi / dan res-drawable-mdpi /, saya mendapatkan res / drawable-nodpi / edition pada Nexus 5 yang menjalankan Android 6.0, yaitu -xxhdpi alat". Apakah Anda memiliki proyek contoh yang menunjukkan perilaku yang Anda kutip?
CommonsWare
Itu karena kamu dulu drawable. Bahasa SDK dapat berubah. Lihat VectorDrawable: Android memuat xhdpi PNG alih-alih sumber daya vektor
rds
"Itu karena Anda menggunakan drawable" - begitu pula jawaban Anda. Setiap direktori sumber daya yang Anda kutip dalam jawaban Anda adalah drawabledirektori sumber daya, sama seperti kedua direktori yang saya kutip dalam bounty saya adalah drawabledirektori sumber daya.
CommonsWare
"Pada xxxdpi, kerangka kerja akan menggunakan bitmap hdpi." - secara khusus itulah yang tidak terjadi, meskipun pengujian saya pada -xxhdpiperangkat. Saya punya res/drawable-mdpi/nodpi_and_m.pngdan res/drawable-nodpi/nodpi_and_m.xml. Pada perangkat Nexus 5, -xxhdpisumber daya yang digunakan adalah res/drawable-nodpi/nodpi_and_m.xml. Menurut algoritme Anda, dan harapan saya, res/drawable-mdpi/nodpi_and_m.pngharus digunakan. Bukan itu yang terjadi.
CommonsWare
2
Intinya: Anda harus menempatkan vektor drawable-anydpi-v21. Jika Anda memiliki pustaka support-vector-drawable, Anda dapat menempatkannya di drawable-anydpiatau secara sederhana drawable.
rds
17

The source code berisi komentar berikut (baris 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;

Semoga ini menghilangkan kebingungan.

Vishavjeet Singh
sumber
8
"Semoga ini menghilangkan kebingungan" - tidak juga. Tidak jelas apa perbedaan antara arti "skala ke kepadatan apa pun" dan "tidak dimaksudkan untuk diskalakan" dalam praktiknya. Drawable dalam -nodpidirektori pasti akan diskalakan berdasarkan ukuran, sesuai dengan aturan apa pun yang berlaku tentang cara drawable digunakan.
CommonsWare
"Tidak dimaksudkan untuk diskalakan" berarti mereka tidak akan diskalakan tidak peduli apa yang dilakukan pemrogram atau kepadatannya.
Vishavjeet Singh
Saya pikir yang mereka maksud dengan frasa "skala ke kepadatan apa pun" bahwa mereka mengacu pada sumber daya dapat digambar vektor yang akan diskalakan agar sesuai dengan kepadatan apa pun, tidak peduli seberapa besar kepadatannya.
Vishavjeet Singh
3
itu ditambahkan di android.googlesource.com/platform/frameworks/base/+/31245b4%5E! , dan dari situ Anda dapat mempelajarinya mungkin memperbaiki beberapa bug 17007265
marcinj
1
@ MarcinJędrzejewski: Sebenarnya, "dipilih sebagai yang paling cocok kecuali ada konfigurasi yang sama persis dengan kepadatan yang diminta", komentar pada komit tersebut memberi saya petunjuk. Terima kasih!
CommonsWare
10

nodpi: Sumber daya untuk semua kepadatan. Ini adalah resource yang tidak bergantung kepadatan. Sistem tidak menskalakan resource yang diberi tag qualifier ini, terlepas dari kepadatan layar saat ini.

anydpi: Qualifier ini cocok dengan semua kepadatan layar dan lebih diutamakan daripada qualifier lainnya. Ini berguna untuk vector drawable. Ditambahkan dalam API Level 21.

dzikovskyy
sumber
9

Saya menggunakan drawable-nodpi untuk semuanya, termasuk banyak grafik besar untuk game saya. Salah satu konsekuensi tidak terdokumentasi dari penskalaan grafis Anda adalah peningkatan penggunaan memori secara eksponensial. Jadi jika Anda memiliki grafik 1MB dalam drawable, itu akan diskalakan menjadi 4MB, 16MB, atau 64MB tergantung pada resolusi perangkat pengguna. Dan resolusi perangkat terus meningkat. Peningkatan tersebut tidak benar-benar meningkatkan ketajaman grafik, tentu saja. Tindakan menggambar dapat menunjukkan seberapa besar seharusnya setiap grafik dalam kaitannya dengan ukuran layar, tidak perlu membengkak aplikasi dengan beberapa folder gambar.

Androidcoder
sumber
3
jawaban yang diremehkan. Saya mengalami masalah yang sama: memiliki gambar berukuran 100KB, tetapi sering mengalami kesalahan OOM saat memuatnya. Aplikasi macet dan menyatakan tidak dapat mengalokasikan 18MB !!! Tidak dapat memahami bagaimana 100KB ini dapat diubah menjadi 18MB, tetapi sebenarnya itu adalah hasil dari penskalaan itu. Mengalihkan gambar ke no-dpi menyelesaikan masalah.
Simon Ninon