PHP中文网2017-04-17 16:26:22
最近剛學這塊,簡單說下我的理解,如有錯誤,歡迎指正
關於dp和px轉換,看一下他們換算公式
dpi = 螢幕水平(垂直)方向像素個數/螢幕的水平(垂直)方向的尺寸
dp = (px * 160) / (螢幕水平(垂直)方向像素個數/螢幕的水平(垂直)方向的尺寸)
你能說螢幕大小和解析度沒有關係?他們不是直接的影響,而是間接的。
你這麼理解也沒問題。 dp是為了適配而生的,以前你再佈局文件中設置按鈕寬度為20px, 在不同分辨率手機調試應用,你會發現他們是不一樣大小的,所以你要手動適配,很累。如果寬度20dp,系統會經過內部換算後在不同解析度下顯示的大小是一致的,這也就是你用尺量,為什麼他們是一樣大小的原因。
最後一個問題,因為沒做過類似工作,就不回答了,不過你可以參考官方裡面關於tv開發的指導文件
迷茫2017-04-17 16:26:22
簡單的說dpi(dots-per-inch)說的是每英吋上的點數,不是每英吋上的像素,ppi(pixel-per-inch)才是每英吋的像素,計算螢幕尺寸是透過ppi來計算的不是透過dpi。
dp與px的轉換公式是:
px = dp * density
density這個值指的就是螢幕的邏輯密度,這個邏輯密度要怎麼計算呢?一般160dpi的density值為1,舉個例子,一般情況下1920*1080 的density就是12X9。實際使用時也需要考慮手機狀態列和標題列所佔用的空間大小。
假設是20dp大小,他在320480 上的像素是20 2 = 40px,在19201080上是 20 12 = 240px 怎麼會一樣大小。
得到了像素px之後再根據螢幕中x,y方向上的ppi來最終決定了控制項的大小。
上面所述的這些值都可以透過DisplayMetrics這類來取得到,
density = mContext.getResources().getDisplayMetrics().density
螢幕x軸方向的ppi = mContext.getResources().getDisplayMepis(
螢幕y軸方向的ppi = mContext.getResources().getDisplayMetrics().ydpi