dp — พื้นฐาน, พิกเซลที่ไม่ขึ้นกับความหนาแน่นใน Android

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-25 เวลาอ่าน: 7 นาที

อธิบายพื้นฐานของ dp (พิกเซลที่ไม่ขึ้นกับความหนาแน่น) — หน่วยวัดใน Android ที่รับประกันขนาดทางกายภาพที่เท่ากันขององค์ประกอบ UI บนหน้าจอที่มีความหนาแน่นของพิกเซลต่างกัน หนึ่ง dp จะเท่ากับ 1/160 นิ้วบนหน้าจอเสมอ ไม่ว่าอุปกรณ์จะมีความละเอียดสูงหรือต่ำก็ตาม ตามข้อมูลของ Google Material Design (2025) ขนาดทั้งหมดในแอปพลิเคชัน Android ควรระบุเป็น dp ไม่ใช่ px มิฉะนั้นอินเทอร์เฟซจะดูแตกต่างกันบนอุปกรณ์ต่างๆ

ประเด็นสำคัญ

  • dp (พิกเซลที่ไม่ขึ้นกับความหนาแน่น) — หน่วยวัดเชิงนามธรรมใน Android เท่ากับ 1/160 นิ้วบนหน้าจอ
  • สูตรการแปลง: px = dp × (dpi / 160) บนหน้าจอ mdpi 1 dp = 1 px บน xxhdpi 1 dp = 3 px
  • ขนาดทั้งหมดในเค้าโครง XML (layout_width, padding, margin) ระบุเป็น dp
  • dimens.xml — ไฟล์ทรัพยากร Android สำหรับจัดเก็บค่ากลางของ dp
  • ตามข้อมูลของ Google Android Performance Guide (2025) การใช้ dp แทน px ช่วยขจัดปัญหา 90% ของการปรับอินเทอร์เฟซบนหน้าจอต่างๆ

dp ใน Android คืออะไร?

dp (พิกเซลที่ไม่ขึ้นกับความหนาแน่น) เป็นหน่วยวัดเสมือนใน Android ที่ถูกนำมาใช้เพื่อรวมขนาดขององค์ประกอบ UI บนอุปกรณ์ที่มีความหนาแน่นของพิกเซลต่างกัน หนึ่ง dp มีค่าเท่ากับประมาณหนึ่งพิกเซลทางกายภาพบนหน้าจอที่มีความหนาแน่น 160 dpi (mdpi) บนหน้าจอที่มีความหนาแน่น 320 dpi (xhdpi) 1 dp เท่ากับ 2 พิกเซลทางกายภาพ ดังนั้นขนาดทางกายภาพขององค์ประกอบบนหน้าจอยังคงเท่าเดิม — ประมาณ 1/160 นิ้ว ตามข้อมูลของ Android Developers (2025) dp เป็นหน่วยวัดเดียวที่ควรใช้สำหรับขนาด layout, padding, margin และความกว้าง/ความสูงของ view

ทำไมไม่ควรใช้ px

หากคุณกำหนดความกว้างของปุ่มเป็น 160 px บนหน้าจอ mdpi จะกว้าง 1 นิ้ว แต่บนหน้าจอ xxxhdpi (640 dpi) — เพียง 0.25 นิ้ว dp แก้ปัญหานี้: 160 dp บนหน้าจอใดๆ จะเท่ากับ 1 นิ้ว Android จะแปลง dp เป็น px โดยอัตโนมัติผ่าน DisplayMetrics.density ระหว่างการเรนเดอร์ ตามข้อมูลของ Android Developer Blog (2025) ก่อนการนำ dp มาใช้ (Android 1.0) นักพัฒนาต้องคำนวณออฟเซ็ต px ด้วยตนเอง ซึ่งทำให้เกิดบั๊กอย่างต่อเนื่องเมื่อพอร์ต

dp, px และ sp: แตกต่างกันอย่างไร

dp, px และ sp เป็นสามหน่วยวัดใน Android แต่ละหน่วยมีวัตถุประสงค์ของตัวเอง px คือพิกเซลหน้าจอทางกายภาพที่ขึ้นอยู่กับความหนาแน่น dp คือพิกเซลที่ไม่ขึ้นกับความหนาแน่นสำหรับขนาดขององค์ประกอบ sp คือพิกเซลที่ไม่ขึ้นกับสเกลสำหรับข้อความที่คำนึงถึงการตั้งค่าขนาดฟอนต์ของระบบด้วย ตามข้อมูลของ Material Design (2025) ความแตกต่างระหว่าง dp และ sp เป็นจุดสำคัญของการเข้าถึง: ผู้ใช้สายตาไม่ดีจะเพิ่มขนาดฟอนต์ และค่า sp จะปรับโดยอัตโนมัติ ในขณะที่ dp ไม่ปรับ

หน่วยชื่อเต็มคำนึงถึงความหนาแน่นคำนึงถึงการตั้งค่าฟอนต์การใช้งาน
pxพิกเซลไม่ไม่ไม่แนะนำ
dpพิกเซลที่ไม่ขึ้นกับความหนาแน่นใช่ไม่เค้าโครง, padding, ระยะขอบ
spพิกเซลที่ไม่ขึ้นกับสเกลใช่ใช่ขนาดข้อความ

สูตรแปลง dp เป็น px และกลับกัน

สูตรการแปลง dp เป็น px: px = dp × (dpi / 160) สำหรับการแปลงกลับ: dp = px / (dpi / 160) density คืออัตราส่วน dpi / 160 ซึ่ง Android คำนวณตาม DisplayMetrics บน mdpi density = 1.0, บน hdpi = 1.5, บน xhdpi = 2.0, บน xxhdpi = 3.0, บน xxxhdpi = 4.0 ดังนั้น 48 dp ในพิกเซล: บน mdpi — 48 px, บน xxhdpi — 144 px ตามข้อมูลของ Google I/O 2024 สูตรนี้สามารถใช้สำหรับการแปลงโดยประมาณของ pt (จุด) iOS เป็น dp — 1 pt ≈ 1 dp

Bucketความหนาแน่นค่า dpi48 dp เป็น px16 dp เป็น px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: การจัดการขนาดแบบรวมศูนย์

dimens.xml คือไฟล์ทรัพยากร Android ใน res/values/ ที่ออกแบบมาเพื่อจัดเก็บขนาดทั้งหมดเป็น dp (และ sp สำหรับข้อความ) การรวมศูนย์ขนาดใน dimens.xml ช่วยให้การบำรุงรักษาง่ายขึ้น: การเปลี่ยนค่าเดียวใน dimens.xml จะอัปเดตขนาดบนทุกหน้าจอของแอปพลิเคชัน คุณสามารถสร้างไฟล์ dimens.xml ที่มีคุณสมบัติสำหรับความหนาแน่นต่างๆ (values-hdpi, values-xhdpi) ตามข้อมูลของ Android Jetpack Docs (2025) Google แนะนำให้จัดเก็บระยะขอบ, padding, ความกว้างขององค์ประกอบ (ค่าคงที่), ขนาดอวาตาร์ และความสูงของแถบเครื่องมือใน dimens.xml

XML


<resources>
    <dimen name="margin_small">8dp</dimen>
    <dimen name="margin_medium">16dp</dimen>
    <dimen name="margin_large">24dp</dimen>
    <dimen name="avatar_size">48dp</dimen>
    <dimen name="toolbar_height">56dp</dimen>
    <dimen name="text_size_body">14sp</dimen>
    <dimen name="icon_size_small">24dp</dimen>
</resources>

ในไฟล์นี้ แต่ละ dimen มีชื่อและค่า การใช้งานในมาร์กอัป XML: @dimen/avatar_size ตามข้อมูลของ Material Design Guidelines (2025) ขั้นตอนกริดพื้นฐานใน Android คือ 8 dp (กริด 8 จุด) ระยะขอบ ขนาดองค์ประกอบ และระยะทางทั้งหมดต้องเป็นผลคูณของ 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp สำหรับข้อความ ขั้นตอนคือ 4 sp

การใช้ dp ในการเขียนโปรแกรมใน Kotlin และ XML

ในมาร์กอัป XML ใช้ dp โดยตรง: android:layout_width="48dp" ในโค้ดการเขียนโปรแกรม (Kotlin/Java) คุณต้องแปลง dp เป็น px โดยใช้ TypedResource หรือฟังก์ชันส่วนขยาย TypedResource มีวิธีการพร้อมใช้สำหรับทำงานกับ dp ในรันไทม์: getDimensionPixelSize() คืนค่า px เป็นจำนวนเต็ม ใน Jetpack Compose dp เป็นหน่วยวัดมาตรฐานในตัวปรับแต่งและคอนเทนเนอร์เค้าโครง

Kotlin
// การแปลง dp เป็น px ด้วยโปรแกรม
fun Context.dpToPx(dp: Int): Int {
    return (dp * resources
        .displayMetrics
        .density).toInt()
}

// การใช้งานใน Activity
val paddingPx = dpToPx(16)
button.setPadding(
    paddingPx,
    paddingPx,
    paddingPx,
    paddingPx,
)

// Jetpack Compose: dp เป็นหน่วยในตัว
Modifier
    .padding(16.dp)
    .size(48.dp)

ในตัวอย่างนี้ dpToPx() คือฟังก์ชันส่วนขยายสำหรับ Context ที่แปลง dp เป็น px โดยใช้ displayMetrics.density ใน Jetpack Compose dp ถูกสร้างไว้ในระบบชนิดและไม่ต้องการการแปลงด้วยตนเอง — คอมไพเลอร์จะแปล dp เป็น px โดยอัตโนมัติในขั้นตอนการเรนเดอร์

มาร์กอัป XML กับ dp

XML

<Button
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:padding="@dimen/margin_medium"
    android:textSize="@dimen/text_size_body"
    android:text="@string/button_label"
    android:layout_marginTop="16dp"
/>

ใน XML dp ระบุเป็นส่วนต่อท้ายของตัวเลข — margin_top="16dp" สำหรับข้อความใช้ sp — textSize="@dimen/text_size_body" การอ้างอิง @dimen ช่วยให้การจัดการค่าแบบรวมศูนย์ การใช้ match_parent สำหรับความกว้างและ 48dp สำหรับความสูงเป็นรูปแบบ Material Design มาตรฐานสำหรับปุ่ม

ข้อผิดพลาดทั่วไปเมื่อใช้ dp

ตามการวิเคราะห์แอปพลิเคชัน Android จาก Google Play Console (2025) ข้อผิดพลาดห้าประการที่พบบ่อยที่สุดคือ: การใช้ px แทน dp ในมาร์กอัป XML การไม่มี dimens.xml (ค่าที่เขียนแบบอินไลน์) การแปลง dp เป็น px ไม่ถูกต้องในโค้ด (ใช้การหารจำนวนเต็ม) การละเลย sp สำหรับข้อความ และไม่คำนึงถึงการตั้งค่าขนาดฟอนต์ของระบบผ่าน sp การหารจำนวนเต็ม เป็นข้อผิดพลาดที่อันตรายที่สุด: ใน Kotlin val px = dp * density — ถ้า dp และ density เป็น Int ผลลัพธ์ก็จะเป็น Int ด้วย และความแม่นยำจะสูญเสียไป

  • px แทน dp — แอปพลิเคชันดูแตกต่างกันบนอุปกรณ์ที่มีความหนาแน่นต่างกัน แก้ไขโดยการแทนที่ px ด้วย dp ใน XML
  • ค่าแบบอินไลน์ — ขนาดถูกเขียนลงในไฟล์เค้าโครงโดยตรง การทำซ้ำค่าทำให้การบำรุงรักษาและการอัปเดตซับซ้อน
  • sp สำหรับข้อความ — การใช้ dp สำหรับขนาดฟอนต์ละเว้นการตั้งค่าผู้ใช้ ทำลายการเข้าถึง
  • การหารจำนวนเต็ม — ใน Kotlin การหาร Int ด้วย Int จะได้ Int ทำให้สูญเสียเศษส่วน ให้ใช้ Float เสมอ

คำถามที่พบบ่อย

dp แตกต่างจาก pt ใน iOS อย่างไร?

dp ใน Android และ pt (จุด) ใน iOS เป็นหน่วยวัดที่เทียบเท่ากัน 1 dp ใน Android มีค่าประมาณเท่ากับ 1 pt ใน iOS ทั้งสองแนวคิดอธิบายจุดที่ไม่ขึ้นกับความหนาแน่น: บนอุปกรณ์รุ่นเก่าที่มีความหนาแน่นต่ำ 1 dp/pt = 1 px บนอุปกรณ์สมัยใหม่ — 2-4 px ความแตกต่างอยู่ที่ค่าฐาน: Android ใช้ 160 dpi เป็นความหนาแน่นฐาน iOS ใช้ 163 dpi ซึ่งให้อัตราความคลาดเคลื่อนน้อยกว่า 2%

จะแปลง dp เป็น px ใน Jetpack Compose ได้อย่างไร?

ใน Jetpack Compose ไม่จำเป็นต้องแปลง — dp ถูกสร้างไว้ในระบบชนิดแล้ว ตัวปรับแต่งและเค้าโครงทั้งหมดยอมรับ Dp ไม่ใช่ px หากคุณต้องรับ px จาก dp ให้ใช้ density: val px = with(LocalDensity.current) { 16.dp.toPx() } LocalDensity มีปัจจัยการแปลงที่คำนึงถึงความหนาแน่นหน้าจอของอุปกรณ์

ฉันจำเป็นต้องใช้ dp ใน iOS หรือไม่?

dp เป็นคำศัพท์ของ Android ใน iOS สิ่งที่เทียบเท่าคือ pt (จุด) Swift ทำงานกับจุดที่ไม่ขึ้นกับความหนาแน่นของหน้าจอโดยอัตโนมัติ ใน UIKit และ SwiftUI ขนาดทั้งหมดระบุเป็นจุด และระบบจะแปลงเป็น px โดยใช้ตัวคูณสเกลของหน้าจอ (UIScreen.main.scale) หลักการเดียวกัน ชื่อต่างกัน

สรุป

  • dp — พิกเซลที่ไม่ขึ้นกับความหนาแน่น หน่วยนามธรรมสำหรับขนาด UI ใน Android เท่ากับ 1/160 นิ้ว
  • สูตร: px = dp × (dpi / 160) บน mdpi 1 dp = 1 px บน xxhdpi 1 dp = 3 px
  • ขนาดทั้งหมดในมาร์กอัป XML ควรระบุเป็น dp ขนาดข้อความเป็น sp
  • dimens.xml — การจัดเก็บขนาดแบบรวมศูนย์ การเปลี่ยนแปลงครั้งเดียวอัปเดตทั้งอินเทอร์เฟซ
  • กริด 8 จุด: ขนาดทั้งหมดเป็นผลคูณของ 8 dp ระยะห่างข้อความ — 4 sp
  • ในโค้ดการเขียนโปรแกรม ให้ใช้ TypedResource หรือฟังก์ชันส่วนขยายสำหรับการแปลง dp เป็น px

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม