在Android開(kāi)發(fā)中匾效,我們?cè)诿枋鯲iew的寬陆盘、高時(shí)通常使用dp普筹,但是設(shè)計(jì)在UI中進(jìn)行標(biāo)注時(shí),卻使用的是px隘马。所以很多時(shí)候就導(dǎo)致UI和實(shí)際效果不一致太防。史記開(kāi)發(fā)中,給設(shè)計(jì)和開(kāi)發(fā)人員帶來(lái)了很多困擾酸员。
- dp是什么?
- 那么Android為什么要引入dp杏头,直接用px不可以嗎?
- dp和px又是什么關(guān)系?實(shí)際開(kāi)發(fā)中該怎么轉(zhuǎn)換?
在回答上面的問(wèn)題之前,我們需要了解Android上一些基本概念:
- 英寸:指實(shí)際物理計(jì)量單位沸呐,手機(jī)對(duì)角線的大小。一般描述呢燥,手機(jī)的大小都是用的英寸崭添,比如:紅米4x就剛好是5英寸
- 分辨率:屏幕上垂直方向和水平方向上的像素個(gè)數(shù),相同大小的手機(jī)叛氨,分辨率越高呼渣,屏幕的清晰度也越高。
- 像素密度:每英寸的像素點(diǎn)個(gè)數(shù)寞埠,同樣的屁置,像素密度越高,手機(jī)的清晰度也越高仁连。像素密度=√{(長(zhǎng)度像素?cái)?shù)2+寬度像素?cái)?shù)2)}/ 屏幕尺寸蓝角。
-
dp是什么?
dp是Android中的計(jì)量單位阱穗,主要是是用來(lái)標(biāo)注控件的寬、高使鹅。它是一種基于像素密度的抽象單位揪阶,在每英寸160點(diǎn)的顯示器上1dp=1px。
-
Android為什么要引入dp,為什么不可以直接用px?
由于患朱,不同的手機(jī)使用的屏幕像素密度(每英寸屏幕上擁有的像素點(diǎn))不一致鲁僚,如果都使用px進(jìn)行計(jì)量,就會(huì)導(dǎo)致同一個(gè)控件在不同的手機(jī)上裁厅,所表現(xiàn)出來(lái)的差異極大冰沙。
可以看到,如果不用dp進(jìn)行轉(zhuǎn)換执虹,同樣一個(gè)布局拓挥,在不同的手機(jī)上差異巨大,甚至有可能導(dǎo)致布局錯(cuò)亂声畏,這樣對(duì)普通用戶的使用體驗(yàn)極差撞叽。而使用dp就基本不會(huì)出現(xiàn)這 種情況,因?yàn)锳ndroid系統(tǒng)已經(jīng)幫我們進(jìn)行了適配插龄。
-
dp和px的關(guān)系愿棋,以及實(shí)際開(kāi)發(fā)中該怎么轉(zhuǎn)換?
先看一個(gè)公式:<code>px=dp * (dpi/160)</code>,這里的dpi就是我們上面提到的像素密度均牢,至于為什么是除以160糠雨,可以查看知乎上的問(wèn)題為什么 px=dp*(dpi/160),看到這里,我們就明白為什么每英寸160個(gè)像素點(diǎn)的時(shí)候1dp=1px了徘跪。在實(shí)際開(kāi)發(fā)中我們不需要這么計(jì)算甘邀,因?yàn)?lt;code>(dpi/160)</code>這一步Android系統(tǒng)已經(jīng)幫我們計(jì)算好了,所以我們可以通過(guò)以下的方式對(duì)px和dp進(jìn)行轉(zhuǎn)換:
/**
* dp轉(zhuǎn)換px
*/
private fun dp2px(context: Context, dpValue: Float): Float {
return context.resources.displayMetrics.density * dpValue
}
/**
* px轉(zhuǎn)換dp
*/
private fun px2dp(context: Context, pxValue: Float): Float {
return pxValue / context.resources.displayMetrics.density
}
-
補(bǔ)充:
像素密度和屏幕的關(guān)系:
QVGA(240*320) density=120 WQVGA(240*400) density=120 HVGA(320*480) density=160 WVGA(480*800) density=240 WXGA(1280*720) density=320 WUXGA(1920*1200)density=480 QXGA(2018*1536) density=640
不同像素密度對(duì)應(yīng)的drawable文件夾
drawable-ldpi: 屏幕密度為120的手機(jī)設(shè)備 drawable-mdpi: 屏幕密度為160的手機(jī)設(shè)備 drawable-hdpi: 屏幕密度為240的手機(jī)設(shè)備 drawable-xhdpi: 屏幕密度為320的手機(jī)設(shè)備 drawable-xxhdpi:屏幕密度為480的手機(jī)設(shè)備