androidsp與dp
⑴ Android像素單位dp,sp,px,pt的區別和比較
dp = dip : device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬體有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。
pt: point,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,非常簡單易用;
sp: scaled pixels(放大像素). 主要用於字體顯示best for textsize。
由此,根據 google 的建議,TextView 的字型大小最好使用 sp 做單位,而且查看
TextView
的源碼可知 Android 默認使用 sp 作為字型大小單位。
在 Android 中, 1pt 大概等於 2.22sp
以上供參考,如果 UI 能夠以 sp 為單位提供設計是最好的,如果設計中沒有 sp
的概念,則開發人員也可以通過適當的換算取近似值。
過去,程序員通常以像素為單位設計計算機用戶界面。例如,定義一個寬度為300像素的表單欄位,列之間的間距為5個像素,圖標大小為16×16像素 等。這樣處理的問題在於,如果在一個每英寸點數(dpi)更高的新顯示器上運行該程序,則用戶界面會顯得很小。在有些情況下,用戶界面可能會小到難以看清 內容。
與解析度無關的度量單位可以解決這一問題。Android支持下列所有單位。
px(像素):屏幕上的點。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1/72英寸。
dp(與密度無關的像素):一種基於屏幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
dip:與dp相同,多用於android/ophone示例中。
sp(與刻度無關的像素):與dp類似,但是可以根據用戶的字體大小首選項進行縮放。
為了使用戶界面能夠在現在和將來的顯示器類型上正常顯示,建議大家始終使用sp作為文字大小的單位,將dip作為其他元素的單位。當然,也可以考慮使用矢量圖形,而不是用點陣圖
⑵ px,dp和sp,這些單位有什麼區別
px:
即像素,1px代表屏幕上一個物理的像素點;
px單位不被建議使用,因為同樣100px的圖片,在不同手機上顯示的實際大小可能不同,如下圖所示(圖片來自android developer guide,下同)。
偶爾用到px的情況,是需要畫1像素表格線或陰影線的時候,用其他單位如dp會顯得模糊。
dp:
這個是最常用但也最難理解的尺寸單位。它與「像素密度」密切相關,所以首先我們解釋一下什麼是像素密度。假設有一部手機,屏幕的物理尺寸為1.5英
寸x2英寸,屏幕解析度為240x320,則我們可以計算出在這部手機的屏幕上,每英寸包含的像素點的數量為240/1.5=160dpi(橫向)或
320/2=160dpi(縱向),160dpi就是這部手機的像素密度,像素密度的單位dpi是Dots Per
Inch的縮寫,即每英寸像素數量。橫向和縱向的這個值都是相同的,原因是大部分手機屏幕使用正方形的像素點。
不同的手機/平板可能具有不同的像素密度,例如同為4寸手機,有480x320解析度的也有800x480解析度的,前者的像素密度就比較低。
Android系統定義了四種像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它們對應的dp到px的系
數分別為0.75、1、1.5和2,這個系數乘以dp長度就是像素數。例如界面上有一個長度為「80dp」的圖片,那麼它在240dpi的手機上實際顯示
為80x1.5=120px,在320dpi的手機上實際顯示為80x2=160px。如果你拿這兩部手機放在一起對比,會發現這個圖片的物理尺寸「差不
多」,這就是使用dp作為單位的效果,見下圖。
更新20140701:
是不是所有android手機的屏幕寬度用dp衡量都是固定值(例如320dp)呢?答案是否定的,如果寫一個程序畫寬度等於320dp的橫線,在不同手
機上運行,會發現在有些手機上橫線比手機屏幕短,有些則比屏幕長,在平板上與手機上相比差別則更加明顯。
dip:
與dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,後來為了與sp統一就建議使用dp這個名字了。
sp:
與縮放無關的抽象像素(Scale-independent
Pixel)。sp和dp很類似但唯一的區別是,Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是「正常」時
1sp=1dp=0.00625英寸,而當文字尺寸是「大」或「超大」時,1sp>1dp=0.00625英寸。類似我們在windows里調整字
體尺寸以後的效果——窗口大小不變,只有文字大小改變。
還有幾個比較少用到的尺寸單位:
mm:
即毫米;
in:
即英寸,1英寸=2.54厘米(約);
pt:
1pt=1/72英寸=0.035厘米;
最佳實踐,文字的尺寸一律用sp單位,非文字的尺寸一律使用dp單位。例如textSize="16sp"、layout_width="60dp";
⑶ Android的px,dp和sp等單位的區別詳解
px:
即像素,1px代表屏幕上一個物理的像素點;
px單位不被建議使用,因為同樣100px的圖片,在不同手機上顯示的實際大小可能不同
dp:
這個是最常用但也最難理解的尺寸單位。它與「像素密度」密切相關,所以首先我們解釋一下什麼是像素密度。假設有一部手機,屏幕的物理尺寸為1.5英寸x2英寸,屏幕解析度為240x320,則我們可以計算出在這部手機的屏幕上,每英寸包含的像素點的數量為240/1.5=160dpi(橫向)或320/2=160dpi(縱向),160dpi就是這部手機的像素密度,像素密度的單位dpi是Dots Per Inch的縮寫,即每英寸像素數量。橫向和縱向的這個值都是相同的,原因是大部分手機屏幕使用正方形的像素點。
不同的手機/平板可能具有不同的像素密度,例如同為4寸手機,有480x320解析度的也有800x480解析度的,前者的像素密度就比較低。
Android系統定義了四種像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它們對應的dp到px的系數分別為0.75、1、1.5和2,這個系數乘以dp長度就是像素數。
例如界面上有一個長度為「100dp」的圖片,那麼它在240dpi的手機上實際顯示為80x1.5=120px,在320dpi的手機上實際顯示為80x2=160px。如果你拿這兩部手機放在一起對比,會發現這個圖片的物理尺寸「差不多」,這就是使用dp作為單位的效果。
dip:
與dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,後來為了與sp統一就建議使用dp這個名字了。
sp:
與縮放無關的抽象像素(Scale-independent Pixel)。sp和dp很類似但唯一的區別是,Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是「正常」時1sp=1dp=0.00625英寸,而當文字尺寸是「大」或「超大」時,1sp>1dp=0.00625英寸。類似我們在windows里調整字體尺寸以後的效果——窗口大小不變,只有文字大小改變。
還有幾個比較少用到的尺寸單位:
mm:
即毫米;
in:
即英寸,1英寸=2.54厘米(約);
pt:
1pt=1/72英寸=0.035厘米;
最佳實踐,文字的尺寸一律用sp單位,非文字的尺寸一律使用dp單位。例如textSize="16sp"、layout_width="60dp";偶爾需要使用px單位,例如需要在屏幕上畫一條細的分隔線時:
<View layout_width="match_parent" layout_height="1px"/>
補充:
1. android.view.ViewGroup.LayoutParams.height及width這兩個屬性的單位為像素,但是為了兼容多種解析度的手機,我們需要最好使用dp。
2. 根據手機的解析度從dp的單位轉成px
public static int dip2px(Context context, float dpValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dpValue*scale + 0.5f);
}
3.根據手機的解析度從px轉成dp
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue/scale + 0.5f);
}
⑷ 淺談android 屏幕適配中 dp和sp的區別
追到Android源碼,發現系統內部用applyDimension()將所有單位都轉換成px 再處理:
public static float applyDimension(int unit, float value, DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
⑸ Android中dip,dp,sp,pt和px的區別詳解
過去,程序員通常以像素為單位設計計算機用戶界面。例如:圖片大小為80×32像素。這樣處理的問題在於,如果在一個每英寸點數(dpi)更高的新顯示器上運行該程序,則用戶界面會顯得很小。在有些情況下,用戶界面可能會小到難以看清內容。由此我們採用與解析度無關的度量單位來開發程序就能夠解決這個問題。Android應用開發支持不同的度量單位。
度量單位含義
dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬體有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
dp: dip是一樣的
px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。
pt: point,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,非常簡單易用;
sp: scaled pixels(放大像素). 主要用於字體顯示best for textsize。
in(英寸):長度單位。
mm(毫米):長度單位。
度量單位的換算公式
在android源碼包TypedValue.java中,我們看如下函數:
代碼如下:
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
該函數功能:是把各單位換算為像素。
metrics.density:默認值為DENSITY_DEVICE / (float) DENSITY_DEFAULT;
metrics.scaledDensity:默認值為DENSITY_DEVICE / (float) DENSITY_DEFAULT;
metrics.xdpi:默認值為DENSITY_DEVICE;
DENSITY_DEVICE:為屏幕密度
DENSITY_DEFAULT:默認值為160
屏幕密度:表示每英寸有多少個顯示點,與解析度是兩個不同的概念。
據px = dip * density / 160,則當屏幕密度為160時,px = dip
根據 google 的建議,TextView 的字型大小最好使用 sp 做單位,而且查看TextView的源碼可知Android默認使用sp作為字型大小單位。將dip作為其他元素的單位。
⑹ Android編程中,sp和px和dp有什麼區別啊,或者說給代表什麼
sp: 一般用來設置字體的大小。設置sp時,如果設置系統的字體為大、小等,應用程序的字體也會跟隨系統變化。
px: 是絕對像素點。設置大小時5px就是五個像素點的長度。
dp: device independent pixels(設備獨立像素),一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
⑺ Android中dip,dp,sp,pt和px的區別
dp:
這個是最常用但也最難理解的尺寸單位。它與「像素密度」密切相關。
不同的手機/平板可能具有不同的像素密度,例如同為4寸手機,有480x320解析度的也有800x480解析度的,前者的像素密度就比較低。
dip:
與dp完全相同,只是名字不同而已。
在早期的Android版本里多使用dip,後來為了與sp統一就建議使用dp這個名字了。
sp:
與縮放無關的抽象像素(Scale-independent Pixel),只用於表示字體大小時使用。
sp和dp很類似但唯一的區別是,Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是「正常」時1sp=1dp=0.00625英寸,而當文字尺寸是「大」或「超大」時,1sp>1dp=0.00625英寸。
pt:
即point,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,Android中沒見到哪裡用過。
px:
即像素(Pixel),1px代表屏幕上一個物理的像素點。
另外還有一個:
dpi:
是dot per inch的縮寫,就是每英寸的像素數,也叫做屏幕密度。
這個值越大,屏幕就越清晰。
慕課上有關於這個的詳細視頻講解,你可以去看看
http://www.imooc.com/video/9349
⑻ android dp和sp的區別
1. dip: device independent pixels( 設備獨立像素 ). 不同設備有不同的顯示效果 , 這個和設備 硬體有關, 一般我們為了支持 WVGA 、 HVGA 和 QVGA 推薦使用這 這個, 不依賴像素。 這里要特別注意 dip 與屏幕密度有關,而屏幕密度又與具體的硬體有關,硬體設置不正 確,有可能導致 dip 不能正常顯示。在屏幕密度為 160 的顯示屏上, 1dip=1px ,有時候可能 你的屏幕解析度很大如 480*800 ,但是屏幕密度沒有正確設置比如說還是 160 ,那麼這個時 候凡是使用 dip 的都會顯示異常,基本都是顯示過小。 dip 的換算: dip ( value ) =(int) (px ( value ) /1.5 + 0.5) 2. dp: 很簡單,和 dip 是一樣的。 3. px: pixels( 像素 ) ,不同的設備不同的顯示屏顯示效果是相同的,這是絕對像素,是多少就 永遠是多少不會改變。 4. sp: scaled pixels( 放大像素 ). 主要用於字體顯示 best for textsize 。 備注 : 根據 google 的推薦,像素統一使用 dip ,字體統一使用 sp 舉個例子區別 px 和 dip : px 就是像素,如果用 px, 就會用實際像素畫,比個如吧,用畫一條長度為 240px 的橫線,在 480 寬的模擬器上看就是一半的屏寬,而在 320 寬的模擬器上看就是 2 / 3 的屏寬了。 而 dip ,就是把屏幕的高分成 480 分,寬分成 320 分。比如你做一條 160dip 的橫線,無論你 在 320 還 480 的模擬器上,都是一半屏的長度。
⑼ android UI中的單位sp與dp理解問題
dp也就是dip。這個和sp基本類似。如果設置表示長度、高度等屬性時可以使用dp 或sp。
但如果設置字體,需要使用sp。
dp是與密度無關,sp除了與密度無關外,還與scale無關。如果屏幕密度為160,這時dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設還是3.2寸),而屏幕密度變成了320。那麼原來TextView的寬度設成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設置成160dp或160sp的話。系統會自動將width屬性值設置成320px的。也就是160 * 320 / 160。其中320 / 160可稱為密度比例因子。也就是說,如果使用dp和sp,系統會根據屏幕密度的變化自動進行轉換。
下面看一下其他單位的含義
px:表示屏幕實際的象素。例如,320*480的屏幕在橫向有320個象素,在縱向有480個象素。
in:表示英寸,是屏幕的物理尺寸。每英寸等於2.54厘米。例如,形容手機屏幕大小,經常說,3.2(英)寸、3.5(英)寸、4(英)寸就是指這個單位。這些尺寸是屏幕的對角線長度。如果手機的屏幕是3.2英寸,表示手機的屏幕(可視區域)對角線長度是3.2*2.54 = 8.128厘米。讀者可以去量一量自己的手機屏幕,看和實際的尺寸是否一致。
mm:表示毫米,是屏幕的物理尺寸。
pt:表示一個點,是屏幕的物理尺寸。大小為1英寸的1/72。
⑽ android安卓系統dp/sp/px換算表比率 ratexxxhdpi是多少
首先要明確兩點,什麼是dpi?什麼是dp?
dpi
=
dots
per
inch(每個inch上有多少個點)
160dpi的屏幕,1dp
=
1px,也就意味著1dp
=
1/160
inch。
所以每個inch上的點數越多(點的密度越大),每個dp對應的px也就越大
dp/sp可以認為是相同的,不過sp通常用於設置字體大小,而dp用於尺寸。
dp/sp與px換算,是和設備的density相關的,dp
*
density
(密度)=
px。
float
density
=
Resources.getSystem().getDisplayMetrics().density;
所謂的xhdpi,其dpi並不是某一固定取值,只要在240~320dpi范圍內的都認為是xhdpi(mdpi/hdpi/xhdpi/xxhdpi類似)。
所以同樣是xhdpi的手機,dp和px的轉換也是不同的。