Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Lấy mật độ màn hình (DPI) lập trình trong Android

Lấy mật độ màn hình (DPI) lập trình trong Android

Hướng dẫn này minh họa cách lấy mật độ pixel (density/DPI) của màn hình thiết bị Android tại runtime.

Bước 1: Tạo dự án mới

Mở Android Studio, chọn File → New Project và điền thông tin cần thiết.

Bước 2: Thiết kế giao diện (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_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="180dp"
        android:text="Density 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 here to Find screen density" />
</RelativeLayout>

Bước 3: Code 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 button;
    TextView textview;
    DisplayMetrics displayMetrics;
    Activity activity;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = findViewById(R.id.btnShowDensity);
        textview = findViewById(R.id.textView);
        activity = this;
        
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                displayMetrics = new DisplayMetrics();
                activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
                
                float density = getResources().getDisplayMetrics().density; // Density ratio (1.0 = mdpi)
                int densityDpi = getResources().getDisplayMetrics().densityDpi; // DPI thực tế (160, 240, 320, 480, 640)
                int widthPixels = displayMetrics.widthPixels;
                int heightPixels = displayMetrics.heightPixels;
                float xdpi = displayMetrics.xdpi; // DPI chính xác theo chiều ngang
                float ydpi = displayMetrics.ydpi; // DPI chính xác theo chiều dọc
                
                String info = "Density Ratio: " + density + "\n" +
                             "Density DPI: " + densityDpi + "\n" +
                             "Width (px): " + widthPixels + "\n" +
                             "Height (px): " + heightPixels + "\n" +
                             "X DPI: " + xdpi + "\n" +
                             "Y DPI: " + ydpi;
                
                textview.setText(info);
            }
        });
    }
}

Bước 4: Cấu hình AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Chạy ứng dụng

Kết nối thiết bị, chạy app. Nhấn nút "Click here to Find screen density" để hiển thị thông tin mật độ màn hình.

Giải thích các giá trị DisplayMetrics:
  • density: Tỷ lệ so với mdpi (1.0=mdpi, 1.5=hdpi, 2.0=xhdpi, 3.0=xxhdpi, 4.0=xxxhdpi)
  • densityDpi: DPI chuẩn (120=ldpi, 160=mdpi, 213=tvdpi, 240=hdpi, 320=xhdpi, 480=xxhdpi, 640=xxxhdpi)
  • xdpi, ydpi: DPI vật lý thực tế của màn hình (ít dùng)
  • widthPixels, heightPixels: Độ phân giải màn hình tính bằng pixel
  • scaledDensity: Tỷ lệ cho font chữ (tùy theo cài đặt font size của user)

Ứng dụng thực tế

// Chuyển đổi dp sang px
public int dpToPx(int dp) {
    return (int) (dp * getResources().getDisplayMetrics().density + 0.5f);
}

// Chuyển đổi px sang dp
public int pxToDp(int px) {
    return (int) (px / getResources().getDisplayMetrics().density + 0.5f);
}

// Lấy kích thước màn hình dp
int screenWidthDp = (int) (widthPixels / density);
int screenHeightDp = (int) (heightPixels / density);