บทความนี้สาธิตวิธีคำนวณและแสดงค่า 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"
tools:context=".MainActivity">
<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="Density will show 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.java
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Button btnShowDensity;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnShowDensity = findViewById(R.id.btnShowDensity);
textView = findViewById(R.id.textView);
btnShowDensity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
// Density (logical density) - ค่าสเกล dp → px
float density = metrics.density; // = dpi / 160
// DPI จริง
int densityDpi = metrics.densityDpi; // DENSITY_LOW/MEDIUM/HIGH/XHIGH/XXHIGH/XXXHIGH
// ขนาดหน้าจอในพิกเซล
int widthPx = metrics.widthPixels;
int heightPx = metrics.heightPixels;
// ขนาดหน้าจอใน dp
float widthDp = widthPx / density;
float heightDp = heightPx / density;
String info = String.format(
"Density (scale): %.2f\n" +
"Density DPI: %d\n" +
"Screen: %d x %d px\n" +
"Screen: %.1f x %.1f dp",
density, densityDpi, widthPx, heightPx, widthDp, heightDp
);
textView.setText(info);
}
});
}
}
ค่าคงที่ Density Bucket (densityDpi)
| Constant | DPI | Ratio (dp:px) | อุปกรณ์ตัวอย่าง |
|---|---|---|---|
| DENSITY_LOW (ldpi) | 120 | 0.75 | เก่า |
| DENSITY_MEDIUM (mdpi) | 160 | 1.0 (baseline) | Baseline |
| DENSITY_HIGH (hdpi) | 240 | 1.5 | Galaxy S3 |
| DENSITY_XHIGH (xhdpi) | 320 | 2.0 | Nexus 4 |
| DENSITY_XXHIGH (xxhdpi) | 480 | 3.0 | Galaxy S4, Nexus 5 |
| DENSITY_XXXHIGH (xxxhdpi) | 640 | 4.0 | Nexus 6, Pixel XL |
| DENSITY_400 | 400 | 2.5 | บางรุ่น |
| DENSITY_560 | 560 | 3.5 | บางรุ่น |
การใช้งานในการพัฒนา
- dp → px:
px = dp * density - px → dp:
dp = px / density - ใช้
TypedValue.applyDimension()สำหรับแปลงหน่วยในโค้ด
DisplayMetrics อื่นๆ ที่มีประโยชน์
float scaledDensity = metrics.scaledDensity; // สำหรับฟอนต์ (เคารพ font size setting) float xdpi = metrics.xdpi; // Physical DPI แนวนอน float ydpi = metrics.ydpi; // Physical DPI แนวตั้ง
Android 11+ (API 30+) - WindowMetrics
API ใหม่สำหรับหลายหน้าจอ/โหมดจอแบ่ง:
WindowMetrics windowMetrics = getWindowManager().getCurrentWindowMetrics(); WindowInsets insets = windowMetrics.getWindowInsets(); // ใช้สำหรับขนาดจริงที่แอปแสดงได้