⑴ android中pt怎麼轉成sp
先看下TypedValue.appplyDimension的源碼
[mw_shl_code=java,true]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;
}[/mw_shl_code]
從代碼中可以看到pt轉px和sp轉px的方法,所以轉換成px再轉成sp就可以了,可以自己寫個方法一次轉換啦:
[mw_shl_code=java,true]value * metrics.xdpi * (1.0f/72) / metrics.scaledDensity = value * metrics.xdpi * (1.0f/(72 * metrics.scaledDensity);[/mw_shl_code]
不然先算出px再從px算pt的話有兩次精度損失。
⑵ android 字是px 的怎麼轉換成sp
在Android開發中常用到px,in,mm,pt,dp,dip,sp這幾個單位px :是屏幕的像素點in :英寸專mm :毫米pt :磅屬,1/72 英寸dp :一個基於density的抽象單位,如果一個160dpi的屏幕,1dp=1pxdip :等同於dpsp :同dp相似,但還會根據用戶的字體大小偏好來縮放。 查看原帖>>
⑶ Android 關於"尺寸"的那些事(dp,dip,sp,pt,px...)
屏幕大小:屏幕大小是手機對角線的物理尺寸,以英寸inch為單位。比如我的Mix 2手機屏幕大小為5.99 inches,意味著我的屏幕對角線長度為5.99inches = 5.99 * 2.54 = 15.2146cm
解析度:屏幕的像素點數,一般表示為a*b。例如某手機解析度為21601080,意味著手機屏幕的豎直方向(長)有2160個像素點,水平方向(寬)有1080個像素點。
px :Pixels ,像素;對應屏幕上的實際像素,是畫面中最小的點(單位色塊),像素大小沒有固定長度值,不同設備上1個單位像素色塊大小不同。
這么說可能有點陌生,用屏幕解析度來說,今年流行起來的「全面屏」解析度是 2160*1080,但是你也可以發現,雖然很多全面屏手機解析度一樣,但是明顯看得出來屏幕大小不一樣,這也解釋了「不同設備像素色塊大小是不同的」。
pt :1pt=1/72 inch,用於印刷業,非常簡單易用;
dpi :Dots Per Inch,每英寸點數;詳見ppi
ppi :Pixels Per Inch,每英寸像素數;數值越大顯示越細膩。計算式:ppi = 屏幕對角線像素數 / 屏幕對角線長度。
還是舉全面屏的例子,解析度2160*1080,屏幕大小是5.9inches,勾股定理可以得到對角線像素數大約是2415,那麼ppi = 2415 / 5.99 = 403.
事實上dpi 和 ppi 一定程度上可以劃等號,都表示像素密度,計算方式完全一致,只不過使用場景不一樣。dpi中的dots點屬於列印或印刷等領域,例如drawable 文件對應的就是dpi,而ppi中的pixel屬於屏幕顯示等領域
dp/dip : Density-independent Pixels,密度無關像素 - 基於屏幕物理密度的抽象單位。1dp等於 160 dpi 屏幕上的dpx,這是 系統為「中」密度屏幕假設的基線密度。在運行時,系統 根據使用中屏幕的實際密度按需要以透明方式處理 dp 單位的任何縮放 。dp 單位轉換為屏幕像素很簡單:px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等於 1.5 物理像素。在定義應用的 UI 時應始終使用 dp 單位 ,以確保在不同密度的屏幕上正常顯示 UI。
如果看完文章還是覺得很懵,那麼可以直接記住: 1dp單位在設備屏幕上總是等於1/160 inch。
sp :Scale-independent Pixels ,與 dp 單位相似,也會根據用戶的字體大小偏好進行縮放。
首先我們放上源碼中對尺寸單位的轉換
可以看到,輸入值類型為dp時,返回 value * DisplayMetrics.density,到這里我們可能會發懵:嗯?不對啊,前面我們不是通過px 和 dp 的換算公式來計算的么,怎麼這里就簡簡單單乘了一個DisplayMetrics.density?不要慌,我們先看看源碼中對DisplayMetrics.density的介紹。
源碼注釋中說到「在160dpi的屏幕下,density的值為1,而在120dpi的屏幕下,density的值為0.75」,我們可以大膽的猜測一下,120dpi下的density=0.75的原因是120dpi * 1 /160dpi=0.75。實際上,也就是這么回事。我們下面會仔細的分析。
需要補充一下,通常意義上Android 屏幕的密度,指的是像素密度dpi/ppi,對應於源碼中的DisplayMetrics.densityDpi。
為什麼引入dp?
Android 引入了dp這一單位,使得不論多大屏幕,多大dpi,顯示的效果始終保持一致。
但是根據前面我們提到的px與dp的換算公式px = dp * (dpi / 160),很顯然,由於相同解析度但不同屏幕大小的設備dpi是不同的,導致px和dp的基本不存在一個固定的換算關系,為了方便屏幕適配,Android設置了6個通用的密度,換算px與dp時採取通用密度計算,而非設備實際的密度。
以下為6種通用密度,以及其最小的解析度
得到上面通用密度之後,我們換算dp與px多了一種簡便方式。前面我們提到Android將mdpi作為基準,此時1px = 1dp,又有px = dp * (dpi / 160),所以我們可以很容易的得到以下換算:
還記不記得前面源碼中的density屬性,實際上DisplayMetrics.density = dpi / 160 ,表示的就是在某個通用密度下dp與px的換算比(1dp/1px的值)
這部分其實和程序員自身已經關系不大了,畢竟參與工作之後這些都是UI人員的活兒了。不過鑒於現在我還只是一枚在校生,還是記下來以免自己遺漏吧。
建議在xhdpi中作圖
原因嘛,首先現在主流解析度是1080p,以及最近流行起來的全面屏18:9,而xhdpi對應720p,向低dpi兼容自然沒問題,即便在xxhdpi中顯示,也會有個不錯的效果。而如果以1920*1080作圖,顯然圖片素材佔用的內存很大,而且也會增大應用安裝包的大小。
只有一個原則:資源放入對應dpi的文件夾中,Android會機智的載入合適的資源。
以drawable資源為例:
我們平時開發小項目&對UI要求不高時,只使用一套xhdpi的資源就足夠了,雖然這可能會導致在hdpi及以下的手機中有些卡頓,因為xhdpi的圖片運行在hdpi及以下的手機上會比較吃內存,不過無傷大雅。
而如果不為圖片資源犯愁時(有UI人員的支持,就是任性),就可以添加所有dpi的資源。當然,重點還是要滿足ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12的規律。
好像說了不少廢話,哈哈,大概就這么多吧。
⑷ dp和px之間的換算公式
在Android開發中,尺寸換算可以說既簡單又復雜,而且還比較碎,特別是屏幕適配的時候肯定會用到他們。今天就來總結一下他們三者的關系,首先說下他們都是什麼。
px:像素單位。最基礎的圖像構成元素單位
dp:與密度無關的像素,這是一個基於屏幕物理密度的抽象單位。
這里要解釋一下密度的概念,密度(dpi):每英寸包含的像素個數(單位是dpi),1dp實際上相當於密度為160dpi的屏上的一個點。可否理解為物理尺寸?也就是說,如果屏幕物理密度是160dpi時,dp和px是等效的。
換算公式 1: px = dp * (dpi / 160)
sp:同dp相似,但還會根據用戶的字體大小偏好來縮放(建議使用sp作為文本的單位,其它用dip)
咱們廢話不多說,直接上表格,通過這個表格你會非常快速的定位到你要找的內容。
寬×高(標准值) 240×320 320×480 480x800 720x1280 1080x1920 1440×2560
DPI等級 LDPI MDPI HDPI XHDPI XXHDPI XXXHDPI
DPI數值 (density) 120 160 240 320 480 640
對應比例 3 4 6 8 12 16
1DP=?PX 0.75 1 1.5 2 3 4
註:density值表示每英寸有多少個顯示點,與解析度是兩個概念。
MDPI為baseline,其他均以此為基準,在此設備上,1dp = 1px
下面附上開發中用到的dp和px相互轉換的工具類。sp和dp在開發中是同等對待的,只是sp是用來對文字的大小的。其他的全用dp就好。
import android.content.Context;
public class DensityUtil {
/**
* 根據手機的解析度從 dp 的單位 轉成為 px(像素)
*/
* 根據手機的解析度從 px(像素) 的單位 轉成為 dp
*/
這個工具類在網上一大推,而且基本都一樣,加0.5f是有個偏移值,確保精度不流失。scale是在這個類DisplayMetrics中定義的全局變數,其實這個值就是當前手機的density/160
⑸ 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的轉換也是不同的。
⑹ android ui給的標注都是px怎麼轉換
如果是2倍圖,也就是(1280*720)下切圖,2px = 1dp,2px = 1sp;
如果是3倍圖,也就是(1920*1080)下切圖,3px = 1dp,3px =1sp;
如果是4倍圖,也就是(2560*1440)下切圖,4px = 1dp,3px =1sp;
上面都是標準的尺寸,如果屏幕不是標準的,需要單獨適配,建議你看下切圖規范。
⑺ 誰能通俗舉例,dp、sp、px的轉換關系
PPI = Pixels per inch,每英寸上的像素數,即 "像素密度"
xhdpi: 2.0
hdpi: 1.5
mdpi: 1.0 (baseline)
ldpi: 0.75
drawable-ldpi、drawable-mdpi、drawable-hdpi 精度分別為低、中(android默認)、高。
對應的圖片大小為:36x36、48x48、72x72。
xxhdpi: 144*144
xhdpi:96*96
hdpi:72*72
mdpi:48*48
ldpi:36*36
dp是虛擬像素,在不同的像素密度的設備上會自動適配,比如:
在320x480解析度,像素密度為160,1dp=1px
在480x800解析度,像素密度為240,1dp=1.5px
計算公式:1dp*像素密度/160 = 實際像素數
drawable- hdpi、drawable- mdpi、drawable-ldpi的區別:
(1)drawable-hdpi裡面存放高解析度的圖片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi裡面存放中等解析度的圖片,如HVGA (320x480)
(3)drawable-ldpi裡面存放低解析度的圖片,如QVGA (240x320)
系統會根據機器的解析度來分別到這幾個文件夾裡面去找對應的圖片。
ppi的運算方式是:
PPI = √(長度像素數² + 寬度像素數²) / 屏幕對角線英寸數
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
總結得出:
px = dp*ppi/160
dp = px / (ppi / 160)
px = sp*ppi/160
sp = px / (ppi / 160)
⑻ Android中dp和px之間如何進行轉換
1、px :是屏幕的像素點
2、dp :一個基於density的抽象單位,如果一個160dpi的屏幕,1dp=1pxdip
3、轉換方式如下
public class DensityUtil {
/**
* 根據手機的解析度從 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);
}
}