क्या अंतर है -दिल्पी और -नोडपी?


108

यदि आप एंड्रॉइड स्टूडियो 1.5.0 में वेक्टर एसेट विज़ार्ड का उपयोग करते हैं, तो उस विज़ार्ड का उपयोग करके आपके द्वारा आयात किया गया कोई भी वेक्टर ड्रॉबल एक्सएमएल में चला जाता है res/drawable/

हालाँकि, build/निर्देशिका, और परिणामी एपीके दिखाते हैं कि उन XML फ़ाइलों को एक res/drawable-anydpi-v21/संसाधन निर्देशिका में स्थानांतरित किया जाता है । -v21के रूप में हिस्सा है, समझ में आता है VectorDrawableकेवल API स्तर 21+ पर समर्थित है। हालाँकि, -anydpiऐसा लगता है कि यह अनिर्दिष्ट है। मुझे उम्मीद होगी -nodpi, दोनों मूल आयात गंतव्य के लिए और जहां निर्माण प्रणाली इसे स्थानांतरित करने के लिए चुनाव करती है।

क्या किसी ने आधिकारिक बयान देखा है कि -anydpiइसका क्या मतलब है, और इसका रिश्ता क्या है -nodpi? मैं व्यावहारिक प्रभावों की तलाश कर रहा हूं, न कि केवल कुछ कोड टिप्पणियों का संकेत है।


जवाबों:


106

nodpi

ये घनत्व-स्वतंत्र संसाधन हैं। वर्तमान स्क्रीन के घनत्व की परवाह किए बिना, सिस्टम इस क्वालिफायर के साथ टैग किए गए संसाधनों को स्केल नहीं करता है।

उदाहरण के लिए:

  • drawable- nodpi /dot.png

डॉट xxhdpi पर छोटा दिखाई देगा, ldpi पर बड़ा।

हालांकि, संसाधन रिज़ॉल्वर मौजूद होने पर एक विशिष्ट क्वालीफ़ायर से मेल खाएगा।

उदाहरण के लिए

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

लॉलीपॉप (एपीआई 21) एचडीपीआई डिवाइस पर, बिटमैप का उपयोग किया जाता है।

लॉलीपॉप (एपीआई 21) xhdpi डिवाइस पर, वेक्टर का उपयोग किया जाता है।

anydpi

ये संसाधन किसी भी डीपीआई में पूर्वता लेते हैं।

उदाहरण के लिए

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

लॉलीपॉप (एपीआई 21) एचडीपीआई डिवाइस पर, वेक्टर का उपयोग किया जाता है।

लॉलीपॉप (एपीआई 21) xhdpi डिवाइस पर, वेक्टर का उपयोग किया जाता है।

संदर्भ

नोट : anydpi में जोड़ा गया परिवर्तन Ic3288d0236fe0bff20bb1599aba2582c25b0db32


यही मैं नहीं देख रहा हूं। मेरे इनाम का हवाला देते हुए: "Res / drawable-nodpi / और res-drawable-mdpi / में समान संसाधन के दो संस्करणों को देखते हुए, मैं एक Nexus 5 6.0 पर चलने वाले Nexus 5 पर Res / drawable-nodpi / संस्करण प्राप्त करता हूं, जो एक -xxhdpi है डिवाइस "। क्या आपके पास एक नमूना परियोजना है जो उस व्यवहार को प्रदर्शित करती है जिसे आप उद्धृत कर रहे हैं?
कॉमन्सवेयर

इसलिए कि आपने उपयोग किया drawable। एसडीके का व्यवहार बदल सकता है। वेक्टरड्राइव
rds

"ऐसा इसलिए है क्योंकि आपने ड्रॉबल का इस्तेमाल किया है" - इसलिए आपने अपने जवाब में ऐसा किया। आपके जवाब में आपके द्वारा उद्धृत हर एक संसाधन निर्देशिका एक drawableसंसाधन निर्देशिका है, बस दोनों निर्देशिकाओं के रूप में जिन्हें मैंने अपने बाउंटी में उद्धृत किया है वे drawableसंसाधन निर्देशिकाएं हैं।
कॉमन्सवेयर

"एक xxxdpi पर, फ्रेमवर्क एचडीपीआई बिटमैप ले जाएगा।" - यह विशेष रूप से वही है जो नहीं हो रहा है, हालांकि मेरा परीक्षण एक -xxhdpiउपकरण पर है। मेरे पास है res/drawable-mdpi/nodpi_and_m.pngऔर res/drawable-nodpi/nodpi_and_m.xml। Nexus 5, -xxhdpiडिवाइस पर, उपयोग किया जाने वाला संसाधन है res/drawable-nodpi/nodpi_and_m.xml। आपके एल्गोरिथ्म के अनुसार, और मेरी अपेक्षाओं का res/drawable-mdpi/nodpi_and_m.pngउपयोग किया जाना चाहिए। जो नहीं हो रहा है।
कॉमन्सवेयर

2
निचला रेखा: आपको वैक्टर को अंदर रखना चाहिए drawable-anydpi-v21। यदि आपके पास समर्थन-सदिश-आकर्षित करने योग्य पुस्तकालय है, तो आप उन्हें drawable-anydpiया बस में रख सकते हैं drawable
आरडीएस

17

स्रोत कोड निम्नलिखित टिप्पणियां (लाइन 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;

आशा है कि यह भ्रम को दूर करता है।


8
"आशा है कि यह भ्रम को दूर करता है" - वास्तव में नहीं। यह स्पष्ट नहीं है कि "किसी घनत्व के पैमाने" और "स्केल किए जाने का मतलब नहीं" के बीच क्या अंतर है, व्यवहार में इसका मतलब है। ड्रॉबल -nodpiका उपयोग कैसे किया जाता है, इसके लिए जो भी नियम हैं, उनके अनुसार, निर्देशिका में आकृतियाँ निश्चित रूप से आकार के आधार पर मापी जाती हैं।
कॉमन्सवेयर

"स्केल्ड का मतलब नहीं है" का अर्थ है कि उन्हें कोई फर्क नहीं पड़ता कि कोई प्रोग्रामर क्या करता है या घनत्व क्या है।
विश्वजीत सिंह

मुझे लगता है कि वे "किसी भी घनत्व के पैमाने" वाक्यांश से मतलब है कि वे वेक्टर ड्रॉबल्स का उल्लेख कर रहे हैं जो किसी भी घनत्व को फिट करने के लिए पैमाने पर होगा चाहे कितना बड़ा घनत्व हो।
विश्वजीत सिंह

3
यह android.googlesource.com/platform/frameworks/base/+/31245b4%5E में जोड़ा गया था ! , और इससे आप सीख सकते हैं कि यह शायद कुछ बग 17007265 तय किया गया है
marcinj

1
@ MarcinJ ,drzejewski: वास्तव में, "सर्वश्रेष्ठ मिलान के रूप में तब तक चुना जाता है जब तक कि एक कॉन्फ़िगरेशन है जो उस अनुरोध पर घनत्व से मेल खाती है जो ठीक से अनुरोध किया गया है" टिप्पणी मुझे एक सुराग देती है। धन्यवाद!
कॉमन्सवेयर

10

nodpi: सभी घनत्व के लिए संसाधन। ये घनत्व-स्वतंत्र संसाधन हैं। वर्तमान स्क्रीन के घनत्व की परवाह किए बिना, सिस्टम इस क्वालिफायर के साथ टैग किए गए संसाधनों को स्केल नहीं करता है।

anydpi: यह क्वालीफायर सभी स्क्रीन घनत्व से मेल खाता है और अन्य क्वालिफायर पर पूर्वता लेता है। यह वेक्टर ड्रॉबल्स के लिए उपयोगी है। एपीआई स्तर 21 में जोड़ा गया।


9

मैं अपने खेल के लिए बड़े ग्राफिक्स के बहुत सारे सहित, सब कुछ के लिए drawable-nodpi का उपयोग करता हूं। आपके ग्राफिक्स को स्केल करने का एक अनैच्छिक परिणाम यह है कि यह मेमोरी उपयोग को तेजी से बढ़ाता है। इसलिए यदि आपके पास ड्रॉएबल में 1MB का ग्राफिक है, तो यह उपयोगकर्ता डिवाइस के रिज़ॉल्यूशन के आधार पर 4MB, 16MB या 64MB तक बढ़ जाएगा। और डिवाइस रिज़ॉल्यूशन ऊपर जा रहा है। स्केलिंग वास्तव में ग्राफिक के तीखेपन को नहीं बढ़ाती है, बेशक। ड्राइंग क्रियाएं यह निर्देशित कर सकती हैं कि स्क्रीन के आकार के संबंध में वैसे भी कितना बड़ा ग्राफिक होना चाहिए, ऐप को कई ड्रॉ फ़ोल्डर्स के साथ ब्लोट करने की आवश्यकता नहीं है।


3
जवाब दिया गया। मुझे एक ही मुद्दे का सामना करना पड़ा: एक छवि 100KB बड़ी थी, लेकिन अक्सर इसे लोड करते समय OOM त्रुटियां थीं। 18MB आवंटित नहीं कर सकता यह बताते हुए ऐप क्रैश हो गया !!! समझ में नहीं आ रहा था कि इन 100KB को 18MB में कैसे बदला जा सकता है, लेकिन यह वास्तव में उस स्केलिंग का परिणाम था। छवि को नो-डीपीआई पर स्विच करने से समस्या हल हो गई।
सिमोन निऑन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.