-Anydpi ve -nodpi Arasındaki Fark Nedir?


108

Android Studio 1.5.0'da Vektör Varlık sihirbazını kullanırsanız, bu sihirbazı kullanarak içe aktardığınız herhangi bir vektör çekilebilir XML içine girer res/drawable/.

Ancak, build/dizin ve sonuçta ortaya çıkan APK, bu XML dosyalarının bir res/drawable-anydpi-v21/kaynak dizinine taşındığını gösterir . -v21Olarak bölüm, mantıklı VectorDrawableyalnızca API Seviye 21+ desteklenir. Ancak, -anydpibelgesiz görünüyor. Ben umuyordum -nodpiorijinal ithal hedef için ve yapı sistemi Seçti taşımak için nereye için hem.

Ne -anydpianlama geldiğine ve ilişkisinin ne olduğuna dair resmi açıklamalar gören oldu -nodpimu? Sadece bazı kod yorumlarının ima ettiklerini değil, pratik efektler arıyorum.


Yanıtlar:


106

nodpi

Bunlar yoğunluktan bağımsız kaynaklardır. Sistem, mevcut ekranın yoğunluğundan bağımsız olarak bu niteleyici ile etiketlenen kaynakları ölçeklemez.

Örneğin:

  • çekilebilir- nodpi /dot.png

Nokta xxhdpi'de küçük, ldpi'de büyük görünecektir.

Ancak, kaynak çözümleyici, varsa belirli bir niteleyici ile eşleşecektir.

Örneğin

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

Bir Lollipop (API 21) hdpi cihazında bit eşlem kullanılır.

Bir Lollipop (API 21) xhdpi cihazında vektör kullanılır.

Anydpi

Bu kaynaklar herhangi bir dpi'de önceliklidir.

Örneğin

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

Bir Lollipop (API 21) hdpi cihazında vektör kullanılır.

Bir Lollipop (API 21) xhdpi cihazında vektör kullanılır.

Referans

Not : Ic3288d0236fe0bff20bb1599aba2582c25b0db32 değişikliğinde anydpi eklendi .


Benim gördüğüm bu değil. Ödülümden alıntı yapıyorum: "Res / drawable-nodpi / ve res-drawable-mdpi / olarak aynı kaynağın iki sürümü verildiğinde, Android 6.0 çalıştıran bir Nexus 5 üzerinde -xxhdpi olan res / drawable-nodpi / sürümünü alıyorum cihaz". Alıntı yaptığınız davranışı gösteren örnek bir projeniz var mı?
CommonsWare

Çünkü kullandın drawable. SDK'nın bahaviour'u değişmiş olabilir. VectorDrawable'a
rds

"Bunun sebebi çekilebilirliği kullanmış olmanızdır" - cevabınızda da öyle. Cevabınızda alıntı yaptığınız her kaynak dizini bir drawablekaynak dizini, tıpkı ödülümde bahsettiğim her iki dizin de drawablekaynak dizinleridir.
CommonsWare

"Bir xxxdpi'de çerçeve, hdpi bit eşlemini alacaktır." - testlerim bir -xxhdpicihazda yapılsa da, tam olarak olan bu değil . Ben res/drawable-mdpi/nodpi_and_m.pngve res/drawable-nodpi/nodpi_and_m.xml. Nexus 5'te -xxhdpicihazda kullanılan kaynak kullanılır res/drawable-nodpi/nodpi_and_m.xml. Algoritmanıza ve beklentilerime res/drawable-mdpi/nodpi_and_m.pnggöre kullanılmalıdır. Olan bu değil.
CommonsWare

2
Alt satır: vektörleri yerleştirmelisiniz drawable-anydpi-v21. Destek vektörü çekilebilir kitaplığınız varsa, bunları içine drawable-anydpiveya basitçe yerleştirebilirsiniz drawable.
rds

17

Kaynak kodu şu açıklamaları (hat 639) içerir:

/**
 * 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;

Umarım bu kafa karışıklığını giderir.


8
"Umarım bu kafa karışıklığını giderir" - aslında değil. Pratikte "herhangi bir yoğunluğa ölçekleme" ile "ölçeklendirilmesi amaçlanmayan" arasındaki farkın ne olduğu açık değildir. İçinde Drawables -nodpidizinleri kesinlikle ölçekli çekilebilir nasıl kullanıldığına ilişkin yerinde ne olursa olsun kurallar uyarınca, boyutuna göre olsun.
CommonsWare

"Ölçeklendirilmesi amaçlanmamıştır", programcı ne yaparsa yapsın veya yoğunluk ne olursa olsun ölçeklenmeyecekleri anlamına gelir.
Vishavjeet Singh

Sanırım, "herhangi bir yoğunluğa ölçekleme" ifadesiyle , yoğunluk ne kadar büyük olursa olsun herhangi bir yoğunluğa uyacak şekilde ölçeklenecek vektör çekilebilirlerine atıfta bulunduklarını kastediyorlar .
Vishavjeet Singh


1
@ MarcinJędrzejewski: Aslında, "istenen yoğunluğa tam olarak uyan bir konfigürasyon yoksa en iyi eşleşme olarak seçilir" yorumu bana ipucu veriyor. Teşekkürler!
CommonsWare

11

nodpi: Tüm yoğunluklar için kaynaklar. Bunlar yoğunluktan bağımsız kaynaklardır. Sistem, mevcut ekranın yoğunluğundan bağımsız olarak bu niteleyici ile etiketlenen kaynakları ölçeklemez.

anydpi: Bu niteleyici, tüm ekran yoğunluklarıyla eşleşir ve diğer niteleyicilerden önceliklidir. Bu, vektör çizimleri için kullanışlıdır. API Seviye 21'e eklendi.


9

Oyunum için bol miktarda büyük grafik dahil her şey için drawable-nodpi kullanıyorum. Grafiklerinizi büyütmenin belgelenmemiş bir sonucu, bellek kullanımını katlanarak artırmasıdır. Bu nedenle, çekilebilir bir 1MB grafiğiniz varsa, kullanıcı cihazının çözünürlüğüne bağlı olarak 4MB, 16MB veya 64MB olarak ölçeklenecektir. Ve cihaz çözünürlükleri artmaya devam ediyor. Bu ölçeklendirme, elbette grafiğin keskinliğini artırmaz. Çizim eylemleri, her bir grafiğin ekran boyutuna göre ne kadar büyük olması gerektiğini yönlendirebilir, uygulamayı birden fazla çizim klasörüyle şişirmeye gerek yoktur.


3
küçümsenmemiş cevap. Aynı sorunla karşılaştım: 100KB büyük bir görüntü vardı, ancak yüklerken sık sık OOM hataları oluşuyordu. Uygulama, 18 MB ayıramadığını belirterek çöktü !!! Bu 100KB'nin 18MB'ye nasıl dönüştürülebileceği anlaşılamadı ama aslında bu ölçeklendirmenin sonucuydu. Görüntünün dpi'siz olarak değiştirilmesi sorunu çözdü.
Simon Ninon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.