概念
-
英文叫pixel,就是像素的意思。比如我的一加七分辨率是1080*2340,就是寬度有1080個像素點。px
-
英文叫 pixels pe inch,就是每英寸有多少個像素。比如一加七手機預設是420像素/英寸。根據定義可以知道,同一個螢幕,同一個分辨率,這個值是固定的。ppi
-
英文叫 dots per inch,就是每英寸有多少個點,這個應該是曆史遺留的說法,以前的列印機就是以點來算的,現在的螢幕是已像素算的,是以這個和 ppi 其實是一樣的東西。常見的數值有160像素/英寸,240像素/英寸,一加七是420像素/英寸。dpi
-
密度,谷歌規定,一塊160像素/英寸的螢幕,密度就是1。那麼320像素/英寸,密度就是2。也就是說:密度 = dpi / 160像素/英寸。density
-
英文叫 density independent pixels,大概就是一個抽象的像素,像素是一個具體的不會變的東西,但是dip會根據螢幕的像素密度變化。dip
-
就是dip。當dpi=160像素/英寸,則1dp=1px。當dpi=320像素/英寸,則1dp=2px。是以,[x]dp=[x*density]px,[x]px=[x/density]dp。dp
換算
主要就是
dp
和
px
的換算,因為一般來說設計給的設計稿都是以px為機關的,但是我們寫界面的時候用的但是是dp。上面已經得出公式了:
- [x]dp=[x*density]px
- [x]px=[x/density]dp
fun dp2px(context: Context, dp: Int): Int {
return (dp * context.resources.displayMetrics.density).toInt()
}
fun px2dp(context: Context, px: Int): Int {
return (px / context.resources.displayMetrics.density).toInt()
}
DisplayMetrics
// 一加七的資料
val metrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(metrics)
LogUtils.e("hello", metrics.density)// 2.625
LogUtils.e("hello", metrics.densityDpi)// 420,也就是dpi
LogUtils.e("hello", metrics.widthPixels)// 1080
LogUtils.e("hello", metrics.heightPixels)// 2260,這裡的值是除掉狀态欄高度80了,螢幕實際搞定是2340。
LogUtils.e("hello", metrics.scaledDensity)// 2.625,預設就是density,除非使用者手動改過
LogUtils.e("hello", metrics.xdpi)// 403.411
LogUtils.e("hello", metrics.ydpi)// 409.903