SetWidth (int pixel) có sử dụng pixel độc lập với thiết bị hoặc pixel vật lý làm đơn vị không? Ví dụ: setWidth (100) có đặt chiều rộng của khung nhìn thành 100 dips hay 100 px không?
Cảm ơn.
SetWidth (int pixel) có sử dụng pixel độc lập với thiết bị hoặc pixel vật lý làm đơn vị không? Ví dụ: setWidth (100) có đặt chiều rộng của khung nhìn thành 100 dips hay 100 px không?
Cảm ơn.
Câu trả lời:
Nó sử dụng pixel, nhưng tôi chắc rằng bạn đang tự hỏi làm thế nào để sử dụng dips thay thế. Câu trả lời là trong TypedValue.applyDimension()
. Đây là một ví dụ về cách chuyển đổi độ sâu sang px trong mã:
// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));
Cách chính xác để có được số lượng DIP không đổi trong mã là tạo tệp XML tài nguyên chứa các giá trị dp giống như sau:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="image_width">100dp</dimen>
<dimen name="image_height">75dp</dimen>
</resources>
Sau đó, tham khảo tài nguyên trong mã của bạn như sau:
float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));
Float mà bạn đã trả lại sẽ được chia tỷ lệ tương ứng với mật độ pixel của thiết bị và vì vậy bạn không cần phải tiếp tục sao chép phương pháp chuyển đổi trong toàn bộ ứng dụng của mình.
Phương thức setWidth (100), đặt 100 px làm chiều rộng (không tính bằng dp). Vì vậy, bạn có thể gặp phải các vấn đề về chiều rộng khác nhau trên các điện thoại android khác nhau. Vì vậy, hãy sử dụng phép đo bằng dp thay vì pixel. = 300px và height = 400px.
int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());
int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;
Tất nhiên, phương pháp này yêu cầu pixel làm tham số.
Dựa trên các câu trả lời ở trên phù hợp với tôi, tôi tạo một số phương thức trợ giúp , chỉ cần thêm chúng vào utils của bạn để sử dụng chúng trong toàn bộ dự án.
// value in DP
public static int getValueInDP(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
public static float getValueInDP(Context context, float value){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
// value in PX
public static int getValueInPixel(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
}
public static float getValueInPixel(Context context, float value){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
}