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

วิธีดึงค่า Screen DPI แบบโปรแกรมใน Android ด้วย Kotlin

ภาพรวม

ตัวอย่างนี้สาธิตวิธีอ่านค่าความหนาแน่นของหน้าจอ (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

หมวดหมู่DPIDensity Ratioใช้กับอุปกรณ์
LDPI1200.75xอุปกรณ์เก่า จอเล็ก
MDPI1601.0x (Baseline)มาตรฐานพื้นฐาน
HDPI2401.5xโทรศัพท์ระดับกลาง
XHDPI3202.0xโทรศัพท์ระดับสูง (เก่า)
XXHDPI4803.0xFlagship ปัจจุบัน
XXXHDPI6404.0xจอความละเอียดสูงมาก

การประยุกต์ใช้

  • คำนวณขนาด View ในหน่วย px จาก dp: val px = (dp * density).toInt()
  • เลือก Image Resource ที่เหมาะกับ Density (drawable-hdpi, drawable-xhdpi, ฯลฯ)
  • ปรับขนาดฟอนต์หรือ Layout ให้เข้ากับหน้าจอ

การทดสอบ

รันแอปบนอุปกรณ์ต่างๆ กดปุ่มจะแสดงค่า Density และหมวดหมู่ของหน้าจอ