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);