Câu trả lời:
density = getResources().getDisplayMetrics().density;
// return 0.75 if it's LDPI
// return 1.0 if it's MDPI
// return 1.5 if it's HDPI
// return 2.0 if it's XHDPI
// return 3.0 if it's XXHDPI
// return 4.0 if it's XXXHDPI
Bạn có thể kiểm tra mật độ màn hình bằng:
switch (getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
// ...
break;
case DisplayMetrics.DENSITY_MEDIUM:
// ...
break;
case DisplayMetrics.DENSITY_HIGH:
// ...
break;
case DisplayMetrics.DENSITY_XHIGH:
// ...
break;
}
CHỈNH SỬA Hãy lưu ý rằng khi Android phát triển, các giá trị khác phải được bao gồm trong các switch
trường hợp. Khi chỉnh sửa này, điều này bao gồm DisplayMetrics.DENSITY_TV
và DisplayMetrics.DENSITY_XXHIGH
. Tham khảo các tài liệu để biết thông tin mới nhất; Tôi sẽ không bận tâm đến việc duy trì câu trả lời này.
density
theo đề xuất của SteD.)
DENSITY_XXHIGH
. Tôi đã thêm từ chối trách nhiệm vào câu trả lời để bao gồm tất cả các trường hợp trong tương lai. :)
Kể từ năm 2018, bạn có thể sử dụng phương pháp dưới đây:
public static String getDeviceDensityString(Context context) {
switch (context.getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
return "ldpi";
case DisplayMetrics.DENSITY_MEDIUM:
return "mdpi";
case DisplayMetrics.DENSITY_TV:
case DisplayMetrics.DENSITY_HIGH:
return "hdpi";
case DisplayMetrics.DENSITY_260:
case DisplayMetrics.DENSITY_280:
case DisplayMetrics.DENSITY_300:
case DisplayMetrics.DENSITY_XHIGH:
return "xhdpi";
case DisplayMetrics.DENSITY_340:
case DisplayMetrics.DENSITY_360:
case DisplayMetrics.DENSITY_400:
case DisplayMetrics.DENSITY_420:
case DisplayMetrics.DENSITY_440:
case DisplayMetrics.DENSITY_XXHIGH:
return "xxhdpi";
case DisplayMetrics.DENSITY_560:
case DisplayMetrics.DENSITY_XXXHIGH:
return "xxxhdpi";
}
}
Nhưng như @Ted đã chỉ ra, luôn luôn tham khảo tài liệu chính thức trước khi sử dụng
Từ các câu trả lời trên, tôi kết hợp chúng và tạo ra hàm dưới đây:
public static String getDeviceDensity(Context context){
String deviceDensity = "";
switch (context.getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
deviceDensity = 0.75 + " ldpi";
break;
case DisplayMetrics.DENSITY_MEDIUM:
deviceDensity = 1.0 + " mdpi";
break;
case DisplayMetrics.DENSITY_HIGH:
deviceDensity = 1.5 + " hdpi";
break;
case DisplayMetrics.DENSITY_XHIGH:
deviceDensity = 2.0 + " xhdpi";
break;
case DisplayMetrics.DENSITY_XXHIGH:
deviceDensity = 3.0 + " xxhdpi";
break;
case DisplayMetrics.DENSITY_XXXHIGH:
deviceDensity = 4.0 + " xxxhdpi";
break;
default:
deviceDensity = "Not found";
}
return deviceDensity;
}
Bây giờ, trên thiết bị nào bạn muốn nhận thông tin mật độ và thư mục nào sẽ được sử dụng, chỉ cần thêm phương thức trên vào hoạt động đó và thêm dòng bên dưới trong onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Log.d("Screen Density: ", Helper.getDeviceDensity(this));
}
Đối với React Native để kiểm tra kích thước hiện tại của thiết bị
import { PixelRatio } from 'react-native';
switch(PixelRatio.get()) {
case 1:
return "mdpi";
case 1.5:
return "hdpi";
case 2:
return "xhdpi";
case 3:
return "xxhdpi";
case 3.5:
return "xxxhdpi";
}
PixelRatio.get()
sẽ trả về một loạt các giá trị tùy thuộc vào kích thước hiển thị được đặt trong cài đặt Android và dpi. Các giá trị đó sẽ không trùng khớp với các giá trị chính xác mà bạn đã đánh phấn.
Trên một số thiết bị (của tôi là Galaxy Tab3), cả mật độ và mật độDpi đều trả về các giá trị lạ như 1,33 (mật độ), 213 (mật độDpi). Vì vậy, giải pháp của tôi là thêm cờ sau:
<item type = "bool" name = "is_mdpi"> [bool] </item>
<item type = "bool" name = "is_hdpi"> [bool] </item>
<item type = "bool" name = " is_xhdpi "> [bool] </item>
<item type =" bool "name =" is_xxhdpi "> [bool] </item>
đến 4 tệp giá trị.xml, hãy đặt các tệp này dưới thư mục res / giá trị- [xxx] / tương ứng.