網頁

2013年5月29日 星期三

Note on Android Display pixel unit

Android 有幾個顯示圖形/文字的單位, 其實不是很容易分辨出來, 尤其有些文件還有錯誤, 網路上有些說明也很混淆, 這邊做個說明整理.
 
 在處理 UI 部份的大小, 位置, 等數據時, 要特別留心用到的是什麼單位.

pt: (Points)
        1/72 of an inch based on the physical size of the screen.
        每一英吋需要畫幾個點.

px: (Pixel)
        corresponds to actual pixels on the screen.
        實際上螢幕上顯示的一個點.

mm: (millimeters)
        公分

in: (inches)
        英吋

以上這些都很簡單直覺, 實在是沒有什麼需要說明的. 真正比較複雜的, dp/dip/sp. 在這之前, 先說明一下 Density Bucket:

 

Density Bucket

        Android 把螢幕的解析分成以下幾個等級, 稱為 Density Bucket,從以的表格, 可以了解到, Android 在顯示到螢幕輸出的時候, 會根據目前實際所需要的輸出, 把圖片做放大縮小, 這樣當我們需要顯示一個 0.5 英吋平方的圖案時, 就可以在大多數的輸出裝置看到大小相近的圖案. 雖然圖案的細節可能有差異 (圖案內容精細與否), 但大小是相仿的. 同時, 對於這些不同的 Density Bucket, 設計者也可以使用不同的 resource 檔案,  針對各不同的 Density Bucket 去做優化.
 
Density Bucket Name
Density Bucket
Screen Density
Ratio
Scaler
Low
ldpi
120 dpi
3
0.75
Medium
mdpi
160 dpi
4
1.00
TV
tvdpi
213 dpi
5.325
1.33
High
hdpi
240 dpi
6
1.50
Extra High
xhdpi
320 dpi
8
2.00
Extra Extra High
xxhdpi
480 dpi
12
3.00

dp/dip (density independent pixel) 是會經過 Density Bucket 做放大縮小的單位, sp則是會再套用使用者的字型單位.
下面這個表格, 可以進一步的說明 dp/dip 是什麼
Device Density
Density Bucket
# of dp
Scaling Factor
Physical Size
232 dpi
hdpi-240 dpi
100 dp
1.5 px/dp
150 px/232 dpi = 0.647 in
240 dpi
hdpi-240 dpi
100 dp
1.5 px/dp
150 px/240 dpi = 0.625 in
263 dpi
hdpi-240 dpi
100 dp
1.5 px/dp
150 px/263 dpi = 0.570 in
314 dpi
xhdpi-320 dpi
100 dp
2.0 px/dp
200 px/314 dpi = 0.637 in
320 dpi
xhdpi-320 dpi
100 dp
2.0 px/dp
200 px/320 dpi = 0.625 in
336 dpi
xhdpi-320 dpi
100 dp
2.0 px/dp
200 px/336 dpi = 0.595 in
 
換句話說, 不管 device 的螢幕大小, 精細程度, 指定同樣的 dp (dip) , 在不同的 device 上, 看到的大小也是相仿的.
 
那如果顯示的結果佔畫面的1/2 或是成比例呢 ? 這時候就不要用 dp/dip 了, 取得螢幕的實際大小, 用 px (pixel ) 去換算, 說不定比較快 (可以參考以下程式碼).
 
DisplayMetrics metrics = new DisplayMetrics(); 
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
 
screen_width =  metrics.widthPixels;
screen_height =  metrics.heightPixels;
 
 
 

沒有留言:

張貼留言

請提供您寶貴的意見