㈠ android系統,240hdpi的時候,1px=多少sp
一般android設置長度和寬度多用dip,設置字體大小多用sp. 在屏幕密度為160,1dp=1px=1dip, 1pt = 160/72 sp 1pt = 1/72 英寸.當屏幕密度為240時,1dp=1dip=1.5px.
㈡ 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/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的轉換也是不同的。
㈣ dp、sp、px區別[完整]
做移動設計的同學,不管是原生app或者web app,應該對字體字型大小都是很頭痛的問題。根本原因是,我們用唯一解析度的電腦,設計各個不同尺寸大小解析度的設備,那簡直要瘋掉了。
但不要著急,我們先來理解一下一些名詞:
我們一般會碰到的度量單位主要有:dpi、ppi、dp、sp、px、pt、in。其中,px應該各位最熟悉的單位,也是我們主要使用的photoshop或者axure等工具用的度量單位,而它在移動端時,的確已經「過時」了。但不要著急把它丟掉,因為它是接下來非常重要的換算單位(所有手機參數還是用px在表達)。
dpi和ppi這兩個是密度單位,不是度量單位,而這兩個恰恰是我們換算中重要的分母。簡單理解一下:
ppi (pixels per inch):圖像解析度 (在圖像中,每英寸所包含的像素數目)
dpi (dots per inch): 列印解析度 (每英寸所能列印的點數,即列印精度)
dpi主要應用於輸出,重點是列印設備上。
我們在移動應用中提到ppi和dpi其實都一樣(概念不同,但對設計來講沒有特別需要深入了解),所以我們先忽略掉dpi。而ppi的運算方式是:
PPI = √(長度像素數² + 寬度像素數²) / 屏幕對角線英寸數
舉個簡單的栗子,iphone5的ppi是多少?ppi=√(1136px² + 640px²)/4 in=326ppi(視網膜Retina屏).這樣大家就能夠明白ppi和px的關系。
這里還提到in(英寸)這個詞,這個非常重要,因為現實中我們經常提到4英寸手機或者5.5英寸大屏手機,而這個尺寸是用戶真正感受升並到的物理大小,所有提到不同尺寸的屏幕不僅僅是解析度或者像素,而更多的是英寸。
好,現在關鍵的來了,dp、sp、pt,是我們設計中的關鍵。
dp:Density-independent pixels,以160PPI屏幕為標准,則1dp=1px,dp和陪禪px的換算公式 :
dp*ppi/160 = px。比如1dp x 320ppi/160 = 2px。
sp:Scale-independent pixels,它是安卓的字體單位,以160PPI屏幕為標准,當字體大小為 100%時, 1sp=1px。
sp 與 px 的換算公式:sp*ppi/160 = px
是不是看起來dp和sp一樣,在Android設計原則中,有提到這兩個單位,他建議文字的尺寸一律用sp單位,非文字的尺寸一律使用dp單位。例如textSize="16sp"、layout_width="60dp"。
為什麼要把sp和dp代替px?最簡單的原因是他們不會因為ppi的變化而變化,在相同物理尺寸和不同ppi下,他們呈現的高度大小是相同。也就是說更接近物理呈吵亂跡現,而px則不行。
但問題來了,ps或者axure裡面沒有sp或者dp這個選項啊,怎麼辦?看到網上有人說用pt去替換px(pt是物理高度,1in=72pt)。 補充一下自己推算的pt轉換px的公式,不一定對,可以參考:例如9pt,再96dpi下,那麼就是9 * 1/72 * 96 =12px。而在72ppi下,9pt=9px。
我再來做個小小的實驗:
1、先了解清楚你筆記本的ppi,比如我的macbook air是11.6英寸,1366 x 768解析度,那麼它的ppi就是135ppi。
2、然後新建一個頁面,輸入的ppi值就是你電腦的ppi值。我們先來看看不同ppi值在電腦上呈現的字體大小是怎麼樣的:
我用的都是arial 14點 (註:專家指正這里不是px而是pt,點) 的字體,但在320ppi、160ppi、135ppi(我自己的)以及標准72ppi下的大小,截然不同。
好,我們再來看看,在電腦上直接截圖web頁之後對比的效果:
你會驚訝的發現,只有72ppi是正常的,其他字體都不對了,因為原本的web設計是不用考慮dp、sp或者ppi的,它是直接px作為物理單位的,而點在72ppi下(1pt x 1/72 x 72dpi=1px)是正常顯示的。所以我們以前做web的時候根本不用擔心自己的設計在別人電腦上看起來會很大或很小。 當然其實像firefox是用96dpi,也就是9pt=12px。
但我再截一下用iphone訪問web之後的圖:
好吧,這時候,你就發現72ppi是見鬼了,因為這個字體在手機上看到完全地小了,所以做移動設計不要傻乎乎地還用72ppi了,不然你很難判斷效果。(當然你也可以藉助我之前提到的同屏工具來映像到移動設備上查看效果,但這個其實會很麻煩很麻煩很麻煩...)
但是到底是選160ppi還是135ppi呢?如果選了135ppi那在別人的電腦上會怎麼樣呢?是不是又要重新調?其實不用,我借用另外一台Retina的macbook pro做了相同的測試,你會發現,其實和屏幕ppi無關,和你在ps里設定的解析度有關。
[補充,有位專家指出我的不對,就是在點和px上我搞錯了,我又嘗試了一下,如果是px的話,不同ppi下字體大小是不變的,而點(pt)的話會有變化。
並且如果是用pt來代替px的話,為了整除方便,那麼ppi一定要設置成72的倍數,比如144ppi,上圖裡面160ppi則會除不盡,所以上圖其實160ppi的字體還是和截圖字體有些許差異。]
然後有專家提出,iOS下是用pt作為字體單位,而Android是以sp作為字體單位,而且web app還是以px作為字體單位。怎麼樣讓設計和輸出單位是一致的?我之前給出的解決方案並不十分嚴謹易懂,所以我重新編輯了一下。
為了求證移動字型大小的問題,跑了一圈同事,最後只能暫時得出一些「不一定正確」的結論:
1、字型大小行業標准幾乎沒有,不像web一樣,宋體12px、14px這樣很清楚。我唯一找到的只有Android的設計建議:
圖中 原作者 還換算了一下在240ppi下對應的px值。
而我問了一圈同事,基本上現在設定字型大小都是憑感覺做事的。當然你也可以參考Android這個標准。
2、如何在電腦上快速預覽高清內容是否排版合理,我想到最簡單的一點就是縮放psd,縮放的比例很關鍵,要達到物理尺寸,首先你得知道你電腦的解析度,我的解析度是135ppi,如果要看解析度是326的iphone上的效果,就縮小到135/326≈41.4%,你就會發現物理尺寸非常接近。可以看看一些排版上的問題。當然你也可以 裝一些工具 來達到更好的效果。
3、怎麼和開發溝通你的字體大小?我也沒有特別好的辦法,就簡單分成3塊來說:
iOS,你設計的時候字體記得用「點」,然後ps設定解析度用標準的72ppi即可,因為據同事說,這樣下的pt值是准確的,或者說iOS自動會轉換這個值。具體也需要大家操作了才知道。而這個解析度下1pt=1px,我簡單換算了一下sp->px->pt的尺寸:
12sp=24.45px=24.45pt;14sp=28.52px=28.52pt;18sp=36.67px=36.67pt;22sp=44.88px=44.88pt;
但這個小數點實在難受,所以四捨五入取整數,並且為了保證可以整除,那麼可以是24pt、28pt、36pt、44pt。
Android,你就用標准sp就好了,當然其他圖片等尺寸你可以用dp來表述。
Web app,這個我也找不到答案,因為Web app還會涉及到響應式設計,而且前端會用em去表示字體比例。所以同樣,如果你用72ppi解析度做的話,直接可以把對應的字型大小告訴開發就好了,當然最好你所用到的字型大小是倍數關系,最小倍數是0.25,這樣用em去做比例的時候會更容易些。比如12px、16px、24px、32px這樣。
有關字體字型大小的研究已經有同事在做,以後有結論了再和大家分享。
原網址:https://zhuanlan.hu.com/zhezhexiong/19565895
㈤ px、dp、sp、dpi之間的區別和轉換
px、dp、sp、dpi之間的區別和轉換
區別:
px (pixels)像素 -- 是像素,就是屏幕上實際的像素點單位。(一般UI人員在ps中經常使用)
dp/dip 設備獨立像素,android layout經常使用的尺寸單位,與設備屏幕有關,dp是虛擬像素,在不同的像素密度的設備上會自動適配。即與像素密度無關。
sp 放大像素,主要是處理字體的大小
dpi:Android支持四種不同的dpi模式:ldpi mdpi hdpi xhdpi
hdpi裡面存放高解析度的圖片,如WVGA (480x800),FWVGA (480x854)
mdpi裡面存放中等解析度的圖片,如HVGA (320x480)
ldpi裡面存放低解析度的圖片,如QVGA (240x320)
轉換:
a.首先了解常見的解析度Resolution:
解析度:指手機屏幕垂直和水平方向上的像素個數。比如解析度是480*320,則指設備垂直方向有480個像素點,水平方向有320個像素點。
VGA 顯示繪圖矩陣 640×480
HVGA half 480×320
QVGA quarter 320x240
b.dpi像素密度,指每英寸中的像素數,該值對應於DisplayMetrics類中屬性densityDpi的值
(例子:設備解析度為320*240,屏幕長2英寸寬1.5英寸 dpi=320/2=240/1.5=160)
c.density屏幕密度,指每平方英寸中的像素數,在DisplayMetrics類中屬性density的值為dpi/160(用這個進行dp sp之間的轉化)
如圖:
d.px 和 dp 互轉換
計算公式:實際像素數px=1dp*像素密度(dpi)/160 =dp*density
在320x480解析度,像素密度dpi為160,1dp=1px
在480x800解析度,像素密度dpi為240,1dp=1.5px
/**
* 根據手機的解析度從 dp 的單位 轉成為 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根據手機的解析度從 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和px之間如何進行轉換
在Android開發中常用到px,in,mm,pt,dp,dip,sp這幾個單位px :是屏幕的像素點in :英寸mm :毫米pt :磅,1/72 英寸dp :一個基於density的抽象單位,如果一個160dpi的屏幕,1dp=1pxdip :等同於dpsp :同dp相似,但還會根據用戶的字體大小偏好來縮放。