ภาพรวม
ตัวอย่างนี้สาธิตวิธีอ่านค่าความหนาแน่นของหน้าจอ (Screen Density/DPI) ใน Android โดยใช้ DisplayMetrics
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
เปิด Android Studio เลือก File → New Project
ขั้นตอนที่ 2: Layout (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="Tutorials Point"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="32sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="180dp"
android:text="Screen Density will appear here"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/btnShowDensity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:text="Click to Find Screen Density" />
</RelativeLayout>
ขั้นตอนที่ 3: MainActivity.kt
import android.os.Bundle
import android.util.DisplayMetrics
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var button: Button
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
button = findViewById(R.id.btnShowDensity)
textView = findViewById(R.id.textView)
button.setOnClickListener {
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
val density = resources.displayMetrics.density
val densityDpi = resources.displayMetrics.densityDpi
val scaledDensity = resources.displayMetrics.scaledDensity
val widthPixels = displayMetrics.widthPixels
val heightPixels = displayMetrics.heightPixels
val info = StringBuilder()
info.append("Density (ratio): $density\n")
info.append("Density DPI: $densityDpi\n")
info.append("Scaled Density: $scaledDensity\n")
info.append("Screen: ${widthPixels}x${heightPixels} px\n")
// แปลง DPI เป็นชื่อหมวดหมู่
val densityCategory = when (densityDpi) {
DisplayMetrics.DENSITY_LOW -> "LDPI (~120 dpi)"
DisplayMetrics.DENSITY_MEDIUM -> "MDPI (~160 dpi)"
DisplayMetrics.DENSITY_HIGH -> "HDPI (~240 dpi)"
DisplayMetrics.DENSITY_XHIGH -> "XHDPI (~320 dpi)"
DisplayMetrics.DENSITY_XXHIGH -> "XXHDPI (~480 dpi)"
DisplayMetrics.DENSITY_XXXHIGH -> "XXXHDPI (~640 dpi)"
else -> "Custom ($densityDpi dpi)"
}
info.append("Category: $densityCategory")
textView.text = info.toString()
}
}
}
ขั้นตอนที่ 4: Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.screendensity">
<application ... >
<activity android:name=".MainActivity"> ... </activity>
</application>
</manifest>
ค่าความหนาแน่นมาตรฐานของ Android
| หมวดหมู่ | DPI | Density Ratio | ใช้กับอุปกรณ์ |
|---|---|---|---|
| LDPI | 120 | 0.75x | อุปกรณ์เก่า จอเล็ก |
| MDPI | 160 | 1.0x (Baseline) | มาตรฐานพื้นฐาน |
| HDPI | 240 | 1.5x | โทรศัพท์ระดับกลาง |
| XHDPI | 320 | 2.0x | โทรศัพท์ระดับสูง (เก่า) |
| XXHDPI | 480 | 3.0x | Flagship ปัจจุบัน |
| XXXHDPI | 640 | 4.0x | จอความละเอียดสูงมาก |
การประยุกต์ใช้
- คำนวณขนาด View ในหน่วย px จาก dp:
val px = (dp * density).toInt() - เลือก Image Resource ที่เหมาะกับ Density (drawable-hdpi, drawable-xhdpi, ฯลฯ)
- ปรับขนาดฟอนต์หรือ Layout ให้เข้ากับหน้าจอ
การทดสอบ
รันแอปบนอุปกรณ์ต่างๆ กดปุ่มจะแสดงค่า Density และหมวดหมู่ของหน้าจอ