SetWidth (int pixel) có sử dụng dip hay px không?


Câu trả lời:


221

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

64
Bạn cũng có thể gọi nbDips * getResources (). GetDisplayMetrics (). Mật độ
Romain Guy

9
Trên thực tế, đó chính xác là những gì TypedValue.applyDimension () làm. Tôi đã cân nhắc việc đăng điều đó, nhưng tôi thích duyệt qua API trong trường hợp có bất kỳ điều gì thay đổi ... mặc dù tôi đoán sẽ an toàn khi sử dụng phương pháp đó nếu bạn đồng ý. :)
Dan Lew

12
Phiên bản applyDimension () thực thi nhiều mã hơn và tôi thấy khó đọc hơn một chút. FWIW, dòng tôi đã đăng là những gì chúng tôi thực sự sử dụng khắp nơi trong khuôn khổ và ứng dụng tiêu chuẩn.
Romain Guy

1
Xin chào, tôi đã thử hai ví dụ trên và có vẻ như không tính được pixel một cách chính xác. thay vào đó, nó trả về cho tôi giá trị chính xác mà tôi chỉ định trong chế độ xem của mình: android: layout_width = "50dip" trong trường hợp của tôi. nó sẽ trả lại cho tôi 50 giá trị chính xác trong tệp xml. i sau đó kiểm tra này trong ứng dụng và như mong đợi, giá trị là không chính xác và thu hút quan điểm quá lớn sau đó dự kiến
Jonathan

Giải pháp duy nhất tôi tìm thấy cho chuyển đổi px sang pt, rất hay.
A-Live

24

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.


Trong tình huống của tôi, giải pháp này hoạt động tốt nhất khi tôi có hộp thoại tùy chỉnh có dạng xem danh sách và muốn đặt chiều rộng của Nhãn tiêu đề và cột trong ListView thành cùng chiều rộng.
Wayne Phipps

Câu đầu tiên của bạn hơi buồn cười, về cơ bản bạn đang nói rằng tạo tệp XML là cách thích hợp để "chỉ định [cái gì đó] trong mã" . Tôi nghĩ bạn chỉ đang sử dụng hằng số trong mã chứ không chỉ định nó :)
Joffrey

@Joffrey vâng tôi xem những gì bạn có nghĩa là vì vậy tôi đã cập nhật các từ ngữ hơi
SDJMcHattie

7

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


0

Tất nhiên, phương pháp này yêu cầu pixel làm tham số.


1
Nếu nó nằm trong tệp layout xml, chúng ta có thể chỉ định android: layout_width = "100dip" hoặc android: layout_width = "100px". Trong mã nguồn, chúng tôi không thể chỉ định chiều rộng của bố cục là 100dip?
user256239 Ngày

Không trực tiếp, bạn phải tự chuyển đổi bằng cách sử dụng DisplayMetrics.density.
Romain Guy

0

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());
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.