2011-09-13 65 views
12

Tôi đang đọc bài viết này: http://developer.android.com/guide/practices/screens_support.htmlAndroid: chuyển đổi 'dp' sang 'px'?

Nó nói rằng công thức Android sử dụng để chuyển đổi giữa một dp đơn vị để một px đơn vị như sau:

px = dp * (dpi/160) 

Bài báo cũng đưa ra một ví dụ khi dpi là 240, cho chúng ta px = 1,5 (tôi tính toán cho một pixel dp đơn)

Tuy nhiên, chính xác thì 1.5 có ý nghĩa gì ở đây? Một khi các đơn vị px thực sự là các điểm ảnh thiết bị vật lý, Android sẽ vẽ 1 hoặc 2 pixel?

Trả lời

15

Tùy thuộc vào ngữ cảnh.

Nếu giá trị dp được sử dụng trong ngữ cảnh ngụ ý kích thước, như thuộc tính android:layout_width, thì logic được mô tả cho Resources.getDimensionPixelSize() sẽ được sử dụng. Đó là, giá trị px sẽ được làm tròn đến số nguyên gần nhất, với trường hợp đặc biệt mà nếu px> 0, sau đó giá trị thực tế sẽ có ít nhất 1.

Nếu dp giá trị là được sử dụng trong ngữ cảnh ngụ ý bù đắp, như thuộc tính android:insetLeft của Inset Drawable, logic được mô tả cho Resources.getDimensionPixelOffset() sẽ được sử dụng. Nghĩa là, giá trị px sẽ chỉ được cắt ngắn thành giá trị số nguyên.

Đôi khi giá trị dấu phẩy động chưa sửa đổi được sử dụng, chẳng hạn như đối với thuộc tính android:dashWidth của thẻ <stroke/> trong hình dạng Có thể vẽ, nhưng điều này là khá hiếm. Thông thường kích thước hoặc logic offset được sử dụng, ngay cả khi giá trị dấu phẩy động có thể được sử dụng.

+0

Humm, đó là những gì tôi đang tìm kiếm! Tôi tự hỏi tại sao tài liệu không thể hiện điều này ... Cảm ơn rất nhiều Martin! –

2

Nếu nội dung tôi đọc là chính xác, 1,5px nghĩa là pixel '1' đơn là màu được chỉ định và 0,5 của pixel xung quanh nó sẽ là sự hòa trộn với pixel '1' và pixel tiếp theo cho nó.

Ví dụ:

| A | AB | B |

A là 1,5px và B là 1,5x, do đó pixel ở giữa là hỗn hợp của cả hai.

Vì vậy, bằng cách sử dụng đó, hai pixel bên cạnh nhau sẽ được trộn lẫn với nhau ví dụ với một màn hình 1px

| X | Y |

Bây giờ với màn hình 1,5px:

| XY | YX | Nó trở thành hỗn hợp của cả hai! nhưng pixel được đặt là X sẽ lớn hơn X được đặt là Y

+0

Điều đó thật thú vị nhưng tôi nghĩ đó không phải là những gì bài báo nói. Nó không nói gì về màu sắc cả. Tôi đoán họ chỉ quên nói những gì mà 1.5 thực sự có nghĩa là. Tôi ghét phải nói điều này, nhưng đây là nơi tôi yêu Apple. Tài liệu của họ chính xác hơn rất nhiều! –

+0

Ồ, tôi không đọc nó từ tài liệu Android. Đó là một tính năng phổ biến của rất nhiều hệ điều hành hiện đại và các ứng dụng khác. Ví dụ: không gian có thể là 1,5px trên web và thường xuyên. Trình duyệt tính toán một điều tương tự với những gì tôi mô tả. – Micky

1

px là một pixel. pixel độc lập với quy mô (sp) và pixel độc lập với mật độ (nhúng) bạn muốn sử dụng sp cho kích thước phông chữ và nhúng cho mọi thứ khác.

nhúng == dp

từ đây http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

px 
Pixels - corresponds to actual pixels on the screen. 

in 
Inches - based on the physical size of the screen. 

mm 
Millimeters - based on the physical size of the screen. 

pt 
Points - 1/72 of an inch based on the physical size of the screen. 

dp 
Density-independent Pixels - an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Note: The compiler accepts both "dip" and "dp", though "dp" is more consistent with "sp". 

sp 
Scale-independent Pixels - this is like the dp unit, but it is also scaled by the user's font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and user's preference. 
0

Tôi nghĩ đó sẽ là giải pháp tốt nhất vì nó là phương pháp tiêu chuẩn:

int valueInPx = (int) TypedValue.applyDimension ( TypedValue.COMPLEX_UNIT_PX, valueInDp, getResources(). GetDisplayMetrics());