Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีดึงค่า Screen Density (DPI) โดยโปรแกรมใน Android

บทความนี้สาธิตวิธีคำนวณและแสดงค่า 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)

ConstantDPIRatio (dp:px)อุปกรณ์ตัวอย่าง
DENSITY_LOW (ldpi)1200.75เก่า
DENSITY_MEDIUM (mdpi)1601.0 (baseline)Baseline
DENSITY_HIGH (hdpi)2401.5Galaxy S3
DENSITY_XHIGH (xhdpi)3202.0Nexus 4
DENSITY_XXHIGH (xxhdpi)4803.0Galaxy S4, Nexus 5
DENSITY_XXXHIGH (xxxhdpi)6404.0Nexus 6, Pixel XL
DENSITY_4004002.5บางรุ่น
DENSITY_5605603.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();
// ใช้สำหรับขนาดจริงที่แอปแสดงได้