อะไรคือความแตกต่างระหว่าง -anydpi และ -nodpi?


108

ถ้าคุณใช้ตัวช่วยสร้างเวกเตอร์สินทรัพย์ในสตูดิโอของ Android 1.5.0 ใด ๆ XML เวกเตอร์ drawable res/drawable/คุณนำเข้าโดยใช้ตัวช่วยที่จะเข้าสู่

อย่างไรก็ตามbuild/ไดเร็กทอรีและ APK ที่เป็นผลลัพธ์แสดงว่าไฟล์ 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

บนอุปกรณ์ hdpi ของ Lollipop (API 21) จะใช้บิตแมป

บนอุปกรณ์ xhdpi ของ Lollipop (API 21) จะใช้เวกเตอร์

anydpi

ทรัพยากรเหล่านี้มีความสำคัญเหนือกว่า dpi ใด ๆ

ตัวอย่างเช่น

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

บนอุปกรณ์ hdpi ของ Lollipop (API 21) จะใช้เวกเตอร์

บนอุปกรณ์ xhdpi ของ Lollipop (API 21) จะใช้เวกเตอร์

ข้อมูลอ้างอิง

หมายเหตุ : anydpi ถูกเพิ่มเข้ามาในการเปลี่ยนแปลง Ic3288d0236fe0bff20bb1599aba2582c25b0db32


นั่นไม่ใช่สิ่งที่ฉันเห็น อ้างถึงความโปรดปรานของฉัน: "เมื่อพิจารณาจากทรัพยากรเดียวกันสองรุ่นใน res / drawable-nodpi / และ res-drawable-mdpi / ฉันได้รับ res / drawable-nodpi / edition บน Nexus 5 ที่ใช้ Android 6.0 ซึ่งเป็น -xxhdpi อุปกรณ์ ". คุณมีโครงการตัวอย่างที่แสดงให้เห็นถึงพฤติกรรมที่คุณอ้างถึงหรือไม่?
CommonsWare

drawableนั่นเป็นเพราะคุณใช้ คุณสมบัติของ SDK สามารถเปลี่ยนแปลงได้ ดูVectorDrawable: Android โหลด xhdpi PNG แทนทรัพยากรเวกเตอร์
rds

"นั่นเป็นเพราะคุณใช้ drawable" - คำตอบของคุณก็เช่นกัน ทุกไดเร็กทอรีทรัพยากรเดียวที่คุณอ้างถึงในคำตอบของคุณคือdrawableไดเร็กทอรีทรัพยากรเช่นเดียวกับทั้งสองไดเร็กทอรีที่ฉันอ้างถึงในรางวัลของฉันคือdrawableไดเร็กทอรีทรัพยากร
CommonsWare

"บน xxxdpi เฟรมเวิร์กจะใช้บิตแมป hdpi" - นั่นคือสิ่งที่ไม่เกิดขึ้นโดยเฉพาะแม้ว่าการทดสอบของฉันจะอยู่บน-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ควรใช้ นั่นไม่ใช่สิ่งที่เกิดขึ้น
CommonsWare

2
บรรทัดล่าง: คุณควรวางเวกเตอร์drawable-anydpi-v21เป็น ถ้าคุณมีห้องสมุดสนับสนุนเวกเตอร์ drawable คุณสามารถวางไว้ในหรือเพียงแค่drawable-anydpi drawable
rds

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
"หวังว่านี่จะช่วยขจัดความสับสน" - ไม่จริง ไม่มีความชัดเจนว่าความแตกต่างระหว่างค่าเฉลี่ย "มาตราส่วนกับความหนาแน่นใด ๆ " และค่าเฉลี่ย "ไม่ได้หมายถึงมาตราส่วน" ในทางปฏิบัติคืออะไร Drawables ใน-nodpiไดเร็กทอรีส่วนใหญ่จะได้รับการปรับขนาดตามขนาดตามกฎที่กำหนดไว้สำหรับวิธีใช้ drawable
CommonsWare

"ไม่ได้หมายถึงการปรับขนาด" หมายความว่าจะไม่มีการปรับขนาดไม่ว่าโปรแกรมเมอร์จะทำอะไรหรือมีความหนาแน่นเท่าใดก็ตาม
Vishavjeet Singh

ฉันคิดว่ามันหมายถึงวลี "scale to any density" ที่หมายถึง vector drawables ซึ่งจะปรับขนาดให้พอดีกับความหนาแน่นไม่ว่าความหนาแน่นจะมากแค่ไหนก็ตาม
Vishavjeet Singh

3
มันถูกเพิ่มในandroid.googlesource.com/platform/frameworks/base/+/31245b4%5E! และจากนั้นคุณสามารถเรียนรู้ว่ามันอาจจะแก้ไขข้อบกพร่องบางอย่าง 17007265
marcinj

2
@ MarcinJędrzejewski: จริงๆแล้ว "ถูกเลือกให้เป็นคู่ที่ดีที่สุดเว้นแต่จะมีการกำหนดค่าที่ตรงกับความหนาแน่นที่ร้องขอ" ความคิดเห็นเกี่ยวกับการกระทำนั้นทำให้ฉันได้เบาะแส ขอบคุณ!
CommonsWare

11

nodpi: ทรัพยากรสำหรับความหนาแน่นทั้งหมด ทรัพยากรเหล่านี้เป็นทรัพยากรที่ไม่ขึ้นกับความหนาแน่น ระบบจะไม่ปรับขนาดทรัพยากรที่ติดแท็กด้วยคุณสมบัตินี้โดยไม่คำนึงถึงความหนาแน่นของหน้าจอปัจจุบัน

anydpi: คุณสมบัตินี้ตรงกับความหนาแน่นของหน้าจอทั้งหมดและมีความสำคัญเหนือกว่าคุณสมบัติอื่น ๆ สิ่งนี้มีประโยชน์สำหรับ vector drawables เพิ่มใน API ระดับ 21


9

ฉันใช้ drawable-nodpi สำหรับทุกสิ่งรวมถึงกราฟิกขนาดใหญ่มากมายสำหรับเกมของฉัน ผลที่ตามมาอย่างไม่มีเอกสารของการปรับขนาดกราฟิกของคุณคือการเพิ่มการใช้หน่วยความจำแบบทวีคูณ ดังนั้นหากคุณมีกราฟิกขนาด 1MB ที่สามารถวาดได้มันจะถูกปรับขนาดเป็น 4MB, 16MB หรือ 64MB ขึ้นอยู่กับความละเอียดของอุปกรณ์ผู้ใช้ และความละเอียดของอุปกรณ์ยังคงดำเนินต่อไป การขยายขนาดนั้นไม่ได้เพิ่มความคมชัดของกราฟิกแน่นอน การดำเนินการวาดสามารถกำหนดว่าแต่ละกราฟิกควรมีขนาดใหญ่เพียงใดโดยสัมพันธ์กับขนาดหน้าจอไม่จำเป็นต้องขยายแอปด้วยโฟลเดอร์วาดหลาย ๆ โฟลเดอร์


3
คำตอบที่ประเมินต่ำ ฉันพบปัญหาเดียวกัน: มีรูปภาพขนาดใหญ่ 100KB แต่มักมีข้อผิดพลาด OOM เมื่อโหลด แอพขัดข้องระบุไม่สามารถจัดสรร 18MB ได้ !!! ไม่เข้าใจว่า 100KB เหล่านี้เปลี่ยนเป็น 18MB ได้อย่างไร แต่จริงๆแล้วมันเป็นผลมาจากการปรับขนาดนั้น การเปลี่ยนรูปภาพเป็น no-dpi ช่วยแก้ปัญหาได้
Simon Ninon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.