Câu trả lời:
Bạn sẽ phải chuyển đổi nó từ dps sang pixel bằng hệ số tỷ lệ hiển thị.
final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);
dp
sang px
không? Cảm ơn.
Tôi biết đây là một câu hỏi cũ tuy nhiên tôi đã tìm thấy một cách gọn gàng hơn để thực hiện việc chuyển đổi này.
Java
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
Kotlin
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)
65
là giá trị DP bạn muốn chuyển đổi thành PX
Nhìn vào yêu cầu của bạn, có giải pháp thay thế là tốt. Có vẻ như bạn biết các kích thước trong dp tại thời gian biên dịch, vì vậy bạn có thể thêm một mục làm mờ trong tài nguyên. Sau đó, bạn có thể truy vấn mục nhập mờ và nó sẽ được tự động chuyển đổi thành pixel trong cuộc gọi này:
final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);
Và dimens.xml của bạn sẽ có:
<dimen name="dimen_entry_in_dp">72dp</dimen>
Mở rộng ý tưởng này, bạn chỉ cần lưu trữ giá trị 1dp hoặc 1sp dưới dạng mục nhập làm mờ và truy vấn giá trị và sử dụng nó làm số nhân. Sử dụng phương pháp này, bạn sẽ cách ly mã từ các công cụ toán học và dựa vào thư viện để thực hiện các phép tính.
cách đơn giản nhất (và thậm chí hoạt động từ api 1) đã được thử nghiệm là:
getResources().getDimensionPixelSize(R.dimen.example_dimen);
Từ tài liệu:
Lấy một chiều cho một ID tài nguyên cụ thể để sử dụng làm kích thước trong các pixel thô. Điều này giống như getDimension (int), ngoại trừ giá trị được trả về được chuyển đổi thành pixel nguyên để sử dụng làm kích thước. Chuyển đổi kích thước bao gồm làm tròn giá trị cơ sở và đảm bảo rằng giá trị cơ sở khác không có ít nhất một pixel có kích thước.
Có, nó làm tròn giá trị nhưng nó không tệ lắm (chỉ trong các giá trị lẻ trên các thiết bị hdpi và ldpi cần thêm một giá trị nhỏ khi ldpi không phổ biến lắm) Tôi đã thử nghiệm trong một thiết bị xxhdpi chuyển đổi 4dp thành 16 (pixel) và đó là thật.