เราอธิบายสาระสำคัญของ Screen Density (Density Buckets) ใน Android — การจำแนกหน้าจอตามความหนาแน่นของพิกเซล: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi Screen Density กำหนดว่ามีพิกเซลจริงกี่พิกเซลในหนึ่งนิ้วของหน้าจอ และส่งผลโดยตรงต่อวิธีการแสดงภาพและอินเทอร์เฟซบนอุปกรณ์ต่าง ๆ ตาม Google Android Compatibility Definition (2025) Android รองรับ Density Buckets หลัก 6 รายการและเพิ่มอีกสูงสุด 8 รายการสำหรับอุปกรณ์พับได้
ประเด็นสำคัญ
Screen Density คือจำนวนพิกเซลจริงต่อนิ้วของหน้าจอ (ppi — พิกเซลต่อนิ้ว หรือ dpi — จุดต่อนิ้ว) Android ใช้แนวคิดของ Density Buckets — กลุ่มของหน้าจอที่มีความหนาแน่นใกล้เคียงกันซึ่งใช้ปัจจัยการปรับขนาดเดียวกัน แตกต่างจากความละเอียด (จำนวนพิกเซลในความกว้างและความสูง) ความหนาแน่นกำหนดขนาดทางกายภาพของพิกเซลบนหน้าจอ ตาม Google Pixel Team (2025) ความหนาแน่นของเรือธงสมัยใหม่อยู่ที่ 450-550 ppi ซึ่งสอดคล้องกับ bucket xxhdpi-xxxhdpi
ระบบ Density Buckets ปรากฏใน Android 1.6 Donut (2009) พร้อมกับอุปกรณ์รุ่นแรกที่ 160 dpi (mdpi) เมื่อความละเอียดหน้าจอเพิ่มขึ้น ก็มีการเพิ่ม buckets ใหม่: hdpi (Android 1.6), xhdpi (Android 2.3), xxhdpi (Android 4.1), xxxhdpi (Android 4.4) แต่ละ bucket ใหม่สะท้อนถึงการเพิ่มขึ้นของความหนาแน่น 1.5× หรือ 2× เทียบกับก่อนหน้า ตาม Android Open Source Project (2025) ปัจจุบัน 96% ของอุปกรณ์ Android ที่ใช้งานอยู่มีความหนาแน่นตั้งแต่ hdpi ถึง xxxhdpi
Density Buckets คือช่วงความหนาแน่นที่กำหนดโดย Google สำหรับจัดกลุ่มหน้าจอ Android bucket พื้นฐานคือ mdpi (160 dpi) ปัจจัยการปรับขนาดแสดงว่าทรัพยากรสำหรับ bucket ใด bucket หนึ่งมีขนาดใหญ่กว่า mdpi กี่เท่า ตัวอย่างเช่น xhdpi (2×) หมายความว่าภาพต้องมีขนาดใหญ่เป็น 2 เท่าในความกว้างและความสูงเมื่อเทียบกับรุ่น mdpi ตาม Android Studio Resource Manager (2025) xxhdpi เป็น bucket ที่พบบ่อยที่สุดในอุปกรณ์ที่ใช้งานอยู่ (ส่วนแบ่งตลาด 38%) รองลงมาคือ xhdpi (28%)
| Bucket | ช่วง DPI | สเกล | ตัวอย่างอุปกรณ์ | ส่วนแบ่งตลาด (2025) |
|---|---|---|---|---|
| ldpi | 120 dpi | 0.75× | อุปกรณ์ราคาประหยัดรุ่นเก่า | น้อยกว่า 1% |
| mdpi | 120-160 dpi | 1× | HTC Dream (G1), แท็บเล็ต 7" | 3% |
| hdpi | 160-240 dpi | 1.5× | Samsung Galaxy S2, Nexus 4 | 12% |
| xhdpi | 240-320 dpi | 2× | Google Nexus 5, Moto G | 28% |
| xxhdpi | 320-480 dpi | 3× | Samsung Galaxy S8, Pixel 3 | 38% |
| xxxhdpi | 480-640 dpi | 4× | Samsung Galaxy S24 Ultra, Pixel 9 Pro | 18% |
ความละเอียดหน้าจอ คือจำนวนพิกเซลทั้งหมดในความกว้างและความสูง (เช่น 1080×2400) ความหนาแน่นของหน้าจอ คือจำนวนพิกเซลต่อนิ้ว อุปกรณ์สองเครื่องที่มีความละเอียดเท่ากันอาจมีความหนาแน่นต่างกันหากขนาดหน้าจอทางกายภาพแตกต่างกัน ตัวอย่างเช่น โทรศัพท์ 6 นิ้วที่มีความละเอียด 1080×2400 มีความหนาแน่นประมาณ 440 dpi (xxhdpi) ในขณะที่โทรศัพท์ 5 นิ้วที่มีความละเอียดเดียวกันมีความหนาแน่นประมาณ 530 dpi (xxxhdpi) นี่คือความแตกต่างสำคัญ: อินเทอร์เฟซควรปรับตามความหนาแน่นไม่ใช่ความละเอียด มิฉะนั้นองค์ประกอบจะเล็กเกินไปบนอุปกรณ์ที่มีความหนาแน่นสูง
Android ใช้ ตัวระบุ ในชื่อโฟลเดอร์ res เพื่อโหลดทรัพยากรสำหรับความหนาแน่นของหน้าจอที่เฉพาะเจาะจง: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi เมื่อแอปพลิเคชันเริ่มทำงาน Android จะเลือกทรัพยากรจากโฟลเดอร์ที่ตรงกับความหนาแน่นของอุปกรณ์มากที่สุด หากไม่มีที่ตรงกันทุกประการ ระบบจะใช้ bucket ที่ใกล้ที่สุดหรือปรับขนาดทรัพยากรจากความหนาแน่นที่ต่ำกว่า ตาม Android Docs (2025) ไม่จำเป็นต้องใช้ตัวระบุความหนาแน่นสำหรับเวกเตอร์ (VectorDrawable) — ระบบจะปรับขนาดให้อัตโนมัติ
/res/
drawable-mdpi/
icon_app.png (48x48 px)
drawable-hdpi/
icon_app.png (72x72 px)
drawable-xhdpi/
icon_app.png (96x96 px)
drawable-xxhdpi/
icon_app.png (144x144 px)
drawable-xxxhdpi/
icon_app.png (192x192 px)
ในโครงสร้างนี้ แต่ละโฟลเดอร์ มีไอคอนเดียวกันแต่ขนาดพิกเซลทางกายภาพต่างกัน ขนาดพื้นฐาน 48×48 พิกเซลสำหรับ mdpi จะคูณด้วยปัจจัยการปรับขนาดสำหรับแต่ละ bucket Android จะเลือกไฟล์ที่ถูกต้องโดยอัตโนมัติตาม DisplayMetrics.density ของอุปกรณ์ สำหรับ VectorDrawable (รูปแบบ XML) ไฟล์เดียวใน drawable/ ก็เพียงพอ — ระบบจะปรับขนาดโดยไม่สูญเสียคุณภาพ
การคำนวณขนาด ของภาพสำหรับแต่ละความหนาแน่นขึ้นอยู่กับสูตรง่าย ๆ: ขนาดใน mdpi × ปัจจัยการปรับขนาด หากไอคอนใน mdpi มีขนาด 48×48 px ดังนั้นสำหรับ hdpi จะเป็น 72×72 px (48 × 1.5), สำหรับ xhdpi — 96×96 px (48 × 2), สำหรับ xxhdpi — 144×144 px (48 × 3), สำหรับ xxxhdpi — 192×192 px (48 × 4) ตาม Material Design Guidelines (2025) สูตรนี้ใช้กับทรัพยากรแรสเตอร์ทั้งหมด: ไอคอน, พื้นหลัง, ภาพ และ 9-patch
| Bucket | สเกล | ขนาด mdpi (px) | ขนาดใน bucket (px) |
|---|---|---|---|
| mdpi | 1× | 48×48 | 48×48 |
| hdpi | 1.5× | 48×48 | 72×72 |
| xhdpi | 2× | 48×48 | 96×96 |
| xxhdpi | 3× | 48×48 | 144×144 |
| xxxhdpi | 4× | 48×48 | 192×192 |
การเตรียมที่ถูกต้อง ทรัพยากรสำหรับ Density Buckets ประกอบด้วยกฎสำคัญห้าข้อ หนึ่ง ใช้ VectorDrawable สำหรับไอคอนที่เรียบง่าย — ซึ่งช่วยลดความจำเป็นในการมีห้าสำเนา สอง สำหรับภาพแรสเตอร์ ให้ส่งออกทุกความหนาแน่นจากเครื่องมือออกแบบ (Android Studio Asset Studio สร้างให้อัตโนมัติ) สาม หลีกเลี่ยงการวางภาพใน drawable/ โดยไม่มีตัวระบุ — ระบบจะปรับขนาดโดยสูญเสียคุณภาพ สี่ ทดสอบบนอุปกรณ์ที่มีความหนาแน่นแตกต่างจากอุปกรณ์หลักของคุณ — ตัวจำลองอนุญาตให้เปลี่ยนความหนาแน่นได้ ห้า ใช้ WebP แทน PNG — ตาม Google (2025) WebP ให้ขนาดเล็กกว่า 25-35% ในคุณภาพเดียวกัน
คำถามที่พบบ่อย
mdpi (medium-density pixel-independent) — bucket ความหนาแน่นพื้นฐานใน Android ที่มีความหนาแน่น 160 dpi bucket อื่น ๆ ทั้งหมดคำนวณเทียบกับ mdpi: hdpi — 1.5×, xhdpi — 2× และอื่น ๆ mdpi เทียบเท่ากับหนึ่งพิกเซลจริงต่อหนึ่งพิกเซลที่ไม่ขึ้นกับความหนาแน่น (dp) นักออกแบบใช้ mdpi เป็นข้อมูลอ้างอิงเมื่อสร้างเค้าโครง
ใช้ DisplayMetrics: getResources().getDisplayMetrics().density คืนค่าปัจจัยการปรับขนาด (1.0 สำหรับ mdpi, 3.0 สำหรับ xxhdpi) ในการกำหนด bucket ด้วยโปรแกรม ให้เรียก getResources().getConfiguration().densityDpi Android Studio ยังมี Device Explorer ที่แสดง densityDpi สำหรับอุปกรณ์ที่เชื่อมต่อ
ในทางเทคนิค — ใช่ แต่สูญเสียคุณภาพ หากทรัพยากรมีเฉพาะใน drawable-xxhdpi บนอุปกรณ์ mdpi จะถูกย่อขนาด 3× — ภาพจะเบลอ หากทรัพยากรมีเฉพาะใน mdpi บน xxhdpi จะถูกขยาย — เกิดพิกเซล คำแนะนำ คือเตรียมอย่างน้อยสำหรับ xhdpi, xxhdpi และ xxxhdpi — ซึ่งครอบคลุม 84% ของอุปกรณ์ที่ใช้งานอยู่ (2025) สำหรับ VectorDrawable ไฟล์เดียวที่ไม่มีตัวระบุก็เพียงพอ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ