兩分鐘理解Android中PX、DP、SP的區別
轉載請標明出處:http://blog.csdn.net/donkor_/article/details/77680042
前言:
眾所周知,Android廠商非常多,各種尺寸的android手機、平板層出不窮。導致了Android生態環境的碎片化現象越來越嚴重。Google公司為了解決解析度過多的問題,在Android的開發文件中定義了px、dp、sp,方便開發者適配不同解析度的Android裝置。對於初級程式設計師來說理解掌握適配的一些基礎知識是必須的。
▲ 基礎概念 :
px : 其實就是畫素單位,比如我們通常說的手機分辨列表800*400都是px的單位
sp : 同dp相似,還會根據使用者的字型大小偏好來縮放
dp : 虛擬畫素,在不同的畫素密度的裝置上會自動適配
dip: 同dp
▲ 舉個栗子 : px與dp
pixel,即畫素,1px代表螢幕上的一個物理的畫素點。但px單位不被建議使用。因為同樣畫素大小的圖片在不同手機顯示的實際大小可能不同。要用到px的情況是需要畫1畫素表格線或陰影線的時候,如果用其他單位畫則會顯得模糊。
要理解dp,首先要先引入dpi這個概念,dpi全稱是dots per inch,對角線每英寸的畫素點的個數,所以,它的計算公式如下:
比如height和width即為長寬的畫素,平方和即為對角線的畫素個數,size即我們常說的5寸手機、4寸手機中的5和4,即對角線的長度。
所以,一樣是5寸的手機,解析度越高,dpi越高。解析度相同,螢幕對角線英寸數越小,dpi越高。
而dp也叫dip,是device independent pixels。裝置不依賴畫素的一個單位。在不同的畫素密度的裝置上會自動適配,比如:
在320x480解析度,畫素密度為160,1dp=1px
在480x800解析度,畫素密度為240,1dp=1.5px
計算公式:px = dp * (dpi/160)
我們做個簡單的Sample驗證一下,如下,一個佈局程式碼
<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螢幕對角線英寸數的裝置效果圖如下
在480*800解析度中,5.1螢幕對角線英寸數的裝置效果圖如下
▲ 由此可以看出使用px作為單位的,在不同的裝置中會顯示不同的效果。使用dp作為單位的,會根據不同的裝置進行轉化,適配不同機型。所以建議在長度寬度的數值使用dp作為單位。
▲ 再舉個栗子 : dp與sp
既然我們在上面說了,dp可以自動適配裝置機型,那在字型裡是否也同樣可行?我們再做個簡單的Sample驗證一下,如下,一個佈局程式碼
<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螢幕對角線英寸數的裝置效果圖如下
在480*800解析度中,3.7螢幕對角線英寸數的裝置下,我們修改手機系統字型大小,得到效果圖如下
▲ 由此可以看出使用sp作為字型大小單位,會隨著系統的字型大小改變,而dp作為單位則不會。所以建議在字型大小的數值要使用sp作為單位
▲ 擴充
提供一個工具類:dp與px值轉換
public class DensityUtil {
/**
* 根據手機的解析度從 dp 的單位 轉成為 px(畫素)
*/
public static int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根據手機的解析度從 px(畫素) 的單位 轉成為 dp
*/
public static int px2dp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
相關文章
- px in pt dp(dip) sp in AndroidAndroid
- Android中dip(dp)、dpi、ppi、px、density、sp的概念Android
- Android中px, ppi, dpi, dp, dip, sp概念解析Android
- android中dip、dp、px、sp和螢幕密度Android
- android開發中用到的px、dp、spAndroid
- Android px 與 dp, sp換算公式Android公式
- px、dp和sp,這些單位有什麼區別?
- Android px、dp、sp之間相互轉換Android
- Android中的長度單位詳解(dp、sp、px、in、pt、mm)Android
- px 與 dp, sp換算公式?公式
- 3分鐘搞清ICP和SP證區別
- px,in,mm,pt,dp,dip,sp 之間的換算公式以及區別 螢幕密度公式
- android ui的幾個概念:px,dip(dp),sp,dpi,解析度等AndroidUI
- Android中關於DP與PX的轉換Android
- CSS中PX與EM的區別CSS
- Android螢幕適配dp、px兩套解決辦法Android
- css中單位 px、em 的區別CSS
- em、rem、px、的區別REM
- 什麼是dp,dip,sp和px及他們之間的的關係?《二》
- 10分鐘理解 Android View 事件分發機制AndroidView事件
- 十分鐘理解Java中的弱引用Java
- __weak與__block區別,深層理解兩者區別BloC
- 10分鐘掌握ConcurrentHashMap 3分鐘清楚和HashMap、Hashtable的區別HashMap
- 兩分鐘瞭解Java中volatile!Java
- CSS中px和em屬性的特點與區別CSS
- 十分鐘理解 Java 中的動態代理Java
- Git兩分鐘指南Git
- 10 分鐘理解 ReduxRedux
- px,em,rem,vw,vh之間的區別REM
- 5分鐘通過一個例子理解觀察者模式和釋出訂閱模式的區別模式
- 五分鐘看懂Hashtable原始碼以及與HashMap的區別原始碼HashMap
- 5分鐘內看懂機器學習和深度學習的區別機器學習深度學習
- 三分鐘秒懂BIO/NIO/AIO區別?AI
- 10分鐘教你理解反射反射
- css3中單位px,em,rem,vh,vw,vmin,vmax的區別CSSS3REM
- 3分鐘搞清楚程式與執行緒的區別執行緒
- android中dip、px相互換算Android
- Android中 @和?區別以及?attr/**與@style/**等的區別Android