Có cách nào để đặt chiều cao / chiều rộng của LayoutParams thành pixel độc lập với mật độ (dp) không? Có vẻ như chiều cao / chiều rộng, khi được đặt theo chương trình, được tính bằng pixel chứ không phải dp.
Có cách nào để đặt chiều cao / chiều rộng của LayoutParams thành pixel độc lập với mật độ (dp) không? Có vẻ như chiều cao / chiều rộng, khi được đặt theo chương trình, được tính bằng pixel chứ không phải dp.
Câu trả lời:
Bạn cần chuyển đổi giá trị nhúng của bạn thành pixel:
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());
Đối với tôi điều này không có mẹo.
public static int getDPI(int size, DisplayMetrics metrics){
return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
}
Gọi hàm như thế này,
DisplayMetrics metrics;
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int heigh = getDPI(height or width, metrics);
Vì nó có thể được sử dụng nhiều lần:
public static int convDpToPx(Context context, float dp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}
Tôi thấy thực tế hơn khi sử dụng tỷ lệ chuyển đổi, vì thông thường hơn một giá trị phải được chuyển đổi. Vì tỷ lệ chuyển đổi không thay đổi, nó tiết kiệm một chút thời gian xử lý.
/**
* Get conversion rate from dp into px.<br>
* E.g. to convert 100dp: px = (int) (100 * convRate);
* @param context e.g. activity
* @return conversion rate
*/
public static float convRateDpToPx(Context context) {
return context.getResources().getDisplayMetrics().densityDpi / 160f;
}
Giải pháp trả lời không hiệu quả với tôi, chiều cao của chế độ xem vẫn bị tắt. Tôi đã kết thúc với điều này, hoạt động tốt:
protected int dp2px(int dp){
final float scale = getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
Và nếu bạn muốn làm tròn theo cách khác, pixel sẽ ...
protected float px2dp(float px){
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return Math.round(dp);
}