前言:
眾所周知,Android廠商非常多膏萧,各種尺寸的android手機(jī)漓骚、平板層出不窮。導(dǎo)致了Android生態(tài)環(huán)境的碎片化現(xiàn)象越來越嚴(yán)重榛泛。Google公司為了解決分辨率過多的問題蝌蹂,在Android的開發(fā)文檔中定義了px、dp曹锨、sp孤个,方便開發(fā)者適配不同分辨率的Android設(shè)備。對于初級程序員來說理解掌握適配的一些基礎(chǔ)知識是必須的沛简。
▲ 基礎(chǔ)概念 :
px : 其實(shí)就是像素單位齐鲤,比如我們通常說的手機(jī)分辨列表800*400都是px的單位
sp : 同dp相似,還會根據(jù)用戶的字體大小偏好來縮放
dp : 虛擬像素椒楣,在不同的像素密度的設(shè)備上會自動(dòng)適配
dip: 同dp
▲ 舉個(gè)栗子 : px與dp
pixel给郊,即像素,1px代表屏幕上的一個(gè)物理的像素點(diǎn)捧灰。但px單位不被建議使用淆九。因?yàn)橥瑯酉袼卮笮〉膱D片在不同手機(jī)顯示的實(shí)際大小可能不同。要用到px的情況是需要畫1像素表格線或陰影線的時(shí)候毛俏,如果用其他單位畫則會顯得模糊炭庙。
要理解dp,首先要先引入dpi這個(gè)概念煌寇,dpi全稱是dots per inch煤搜,對角線每英寸的像素點(diǎn)的個(gè)數(shù),所以唧席,它的計(jì)算公式如下:
比如height和width即為長寬的像素,平方和即為對角線的像素個(gè)數(shù)嘲驾,size即我們常說的5寸手機(jī)淌哟、4寸手機(jī)中的5和4,即對角線的長度辽故。
所以徒仓,一樣是5寸的手機(jī),分辨率越高誊垢,dpi越高掉弛。分辨率相同症见,屏幕對角線英寸數(shù)越小,dpi越高殃饿。
而dp也叫dip谋作,是device independent pixels。設(shè)備不依賴像素的一個(gè)單位乎芳。在不同的像素密度的設(shè)備上會自動(dòng)適配遵蚜,比如:
在320x480分辨率,像素密度為160,1dp=1px
在480x800分辨率奈惑,像素密度為240,1dp=1.5px
計(jì)算公式:px = dp * (dpi/160)
我們做個(gè)簡單的Sample驗(yàn)證一下吭净,如下,一個(gè)布局代碼
<Button
android:layout_width="150px"
android:layout_height="wrap_content"
android:text="Test px" />
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="Test dp" />
在480*800分辨率中,3.7屏幕對角線英寸數(shù)的設(shè)備效果圖如下
在480*800分辨率中肴甸,5.1屏幕對角線英寸數(shù)的設(shè)備效果圖如下
▲ 由此可以看出使用px作為單位的寂殉,在不同的設(shè)備中會顯示不同的效果。使用dp作為單位的原在,會根據(jù)不同的設(shè)備進(jìn)行轉(zhuǎn)化友扰,適配不同機(jī)型。所以建議在長度寬度的數(shù)值使用dp作為單位晤斩。
▲ 再舉個(gè)栗子 : dp與sp
既然我們在上面說了焕檬,dp可以自動(dòng)適配設(shè)備機(jī)型,那在字體里是否也同樣可行澳泵?我們再做個(gè)簡單的Sample驗(yàn)證一下实愚,如下,一個(gè)布局代碼
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test dp"
android:textSize="20dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test sp"
android:textSize="20sp" />
在480*800分辨率中,3.7屏幕對角線英寸數(shù)的設(shè)備效果圖如下
在480*800分辨率中兔辅,3.7屏幕對角線英寸數(shù)的設(shè)備下腊敲,我們修改手機(jī)系統(tǒng)字體大小,得到效果圖如下
▲ 由此可以看出使用sp作為字體大小單位,會隨著系統(tǒng)的字體大小改變维苔,而dp作為單位則不會碰辅。所以建議在字體大小的數(shù)值要使用sp作為單位
▲ 拓展
提供一個(gè)工具類:dp與px值轉(zhuǎn)換
public class DensityUtil {
/**
* 根據(jù)手機(jī)的分辨率從 dp 的單位 轉(zhuǎn)成為 px(像素)
*/
public static int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根據(jù)手機(jī)的分辨率從 px(像素) 的單位 轉(zhuǎn)成為 dp
*/
public static int px2dp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}