android 字體 dpi,詳解Android開發中常用的 DPI / DP / SP

Android的碎片化已經被噴了好多年,隨著國內手機廠商的崛起,碎片化也越來越嚴重,根據OpenSignal的最新調查,2014年市面上有18796種不同的Android設備,作為開發者,一個無法回避的難題就是需要適配各種各樣奇奇怪怪的機型。

設備機型不同必然也會導致屏幕大小和分辨率(Resolution)的不同,但是無論分辨率有多大,屏幕有多大,我們手指觸控范圍的大小不會發生變化,所以最優的適配方式應該是指定大小的控件在所有的設備上的顯示都一樣。

Android的官方文檔對此也有明確的說明

When adding support for multiple screens, applications do not work directly with resolution; applications should be concerned only with screen size and density, as specified by the generalized size and density groups.

所以,適配應該與分辨率無關,只與屏幕大小和屏幕密度相關,首先來看一下什么是屏幕密度 - DPI。

DPI

DPI的全稱是 Dots Per Inch,Inch是一個物理單位(無論在任何設備上,其大小都是固定的),所以DPI就指在一個Inch的物理長度內有多少個Dot,160DPI的屏幕就表示一個Inch包含160個Dot,320DPI的屏幕表示一個Inch有320個Dot,所以說Dot的大小是不固定的。

Android設備用DPI來表示屏幕密度(Density),屏幕密度大就表示一個Inch包含的Dot比較多。那PPI是什么呢?

我們會經常看到iPad、iPhone是用PPI來表示屏幕密度,小米Pad也是用PPI來表示。

314c5365f786

其實對Android而言,DPI等價于PPI(Pixels-Per-Inch),DPI最早是用于印刷行業,跟PPI還是有本質不同的,Android應該是誤用了DPI這個概念。具體可以參考PPI vs. DPI: what’s the difference?。

其實我們只要知道在Android設備中,DPI 等價于 PPI 就可以了。

314c5365f786

通常我們說一個設備是多少寸時,指的是屏幕對角線(Diagonal)是多少inch,所以用對角線的像素值(px)除以對角線長度(inch),就可以計算出PPI。

314c5365f786

為了簡化適配工作,Android根據屏幕大小(Inch)和屏幕密度(DPI)對設備做了如下劃分:

314c5365f786

DP

既然有那么多不同分辨率、不同大小的屏幕,使用PX必然會導致適配困難,為了進一步簡化適配工作,Android為我們提供了一個虛擬的像素單位 - DP 或者 DIP (Density-Independent pixel),當然也可以理解為 Device-Independent Pixel。為什么說是虛擬呢,因為它的大小不是一個物理(Phisical)值,而是由操作系統根據屏幕大小和密度動態渲染出來的。

PX跟DP之間的換算關系很簡單

px = dp * (dpi / 160)

舉例來說,小米Pad的屏幕密度為326dpi,如果需要顯示的圖片大小為20dp,那么就需要提供一個 20 _(326 / 160) = 40px_的圖片才能達到最佳顯示效果,如果還要適配一個163dpi的屏幕,那么還需要再提供一個20 (163 / 160) = 20px的圖片。

那么一個20dp的圖片,在不同設備上的顯示效果如何呢?我們以iPad為例來說明。

314c5365f786

iPad2 和 iPad Retina的物理尺寸都是 9.7 inch,不同的是分辨率和PPI,一個是1024x768 / 132ppi,另一個是2048x1536 / 264ppi,

分別計算一下20dp對應多少inch

ipad2 = 20 * (132 / 160) * (7.9 / (math.sqrt(1024 * 1024 + 768 * 768)))

ipad_retina = 20 * (264 / 160) * (7.9 / (math.sqrt(2048 * 2048 + 1536 * 1536)))

計算結果都是0.1018359375,這就是dp的功能,它能保證在所有的設備上顯示的大小都一樣。

如果只提供了一個大小為20px的圖片,為了保證圖片在所有設備上的物理大小都一樣,高DPI的設備上系統會拉伸圖片,低DPI的設備上圖片會被縮小,這樣既會影響UE也會影響APP的執行效率。所以我們需要為不同屏幕密度的設備提供不同的圖片,他們之間的對應關系如下。

314c5365f786

我們在用Sketch作圖的時候,如果1x圖片對應的是屏幕是MDPI (160dpi),那么1.5x,2x就分別對應HDPI,XHDPI。

314c5365f786

SP

SP 全稱是 Scale-independent Pixels,用于字體大小,其概念與DP是一致的,也是為了保持設備無關。因為Android用戶可以根據喜好來調整字體大小,所以要使用sp來表示字體大小。

314c5365f786

參考文獻

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370126.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370126.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370126.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android studio閃退代碼不報錯_代碼不報錯,不代表真的沒錯

今天是生信星球陪你的第695天大神一句話,菜鳥跑半年。我不是大神,但我可以縮短你走彎路的半年~就像歌兒唱的那樣,如果你不知道該往哪兒走,就留在這學點生信好不好~這里有豆豆和花花的學習歷程,從新手到進階&#xff0c…

Centos7操作系統部署指南

一、硬件環境: Dell R620 二、軟件環境: Centos6.4 X86_64 KVM Windows7vnc 三、安裝說明 操作系統更新之迅速,讓作為新手的系統運維人員有點措手不及,相對于老手就胸有成竹。怎么講?由于老手對技術方向把握的非常好&…

Eclipse插件中的SLF4J登錄

一直都在使用Maven和純Java庫進行開發,我從沒想過在開發Eclipse插件時發出一些日志語句可能會成為問題。 但是,在Eclipse開發人員的想象中,一切似乎總是在Eclipse環境中,而Eclipse宇宙之外則什么都沒有。 如果您使用Google搜索上…

CSS(四)

css元素溢出 當子元素的尺寸超過父元素的尺寸時,需要設置父元素顯示溢出的子元素的方式,設置的方法是通過overflow屬性來設置。 overflow的設置項: 1、visible 默認值。內容不會被修剪,會呈現在元素框之外。2、hidden 內容會被修…

mysql排名

轉載自思心思危http://www.cnblogs.com/zengguowang/p/5541431.html 一、sql1{不管數據相同與否,排名依次排序(1,2,3,4,5,6,7.....)} SELECTobj.user_id,   obj.score,  rownum : rownum 1 AS rownum FROM(SELECT…

python中變量名后的逗號_深入淺析python變量加逗號,的含義

逗號,用于生成一個長度為1的元組>>> (1)1>>> (1,)(1,)>>> 1,(1,)因此需要將長度為1的元組中元素提取出來可以用,簡化賦值操作>>> a(1,)>>> ba>>> b(1,)>>> b,a>>> b1最后print打印變量加,實現連續打印…

廣告的顯示和關閉

app或游戲的主頁顯示廣告頁面,實現方式: public class MainActivity extends Activity implements View.OnClickListener{private Button btnShowAd;private RelativeLayout layoutAd;Overrideprotected void onCreate(Bundle savedInstanceState) {supe…

android簽到功能模塊,基于android的課堂簽到系統.doc

基于android的課堂簽到系統本科畢業論文(設計)題 目 基于Android的課堂簽到系統學生姓名 XXX指導教師 XX學 院 信息科學與工程學院專業班級 計算機科學與技術0908班完成時間 2013年5月 摘 要在大學課堂中,簽到問題一直困擾著老師和同學們。傳統課堂簽到的手段大多是…

Java EE 7社區調查結果!

在JSR 342下可以繼續進行Java EE 7的工作。一切進展順利,Java EE 7現在處于“初稿審查”階段。 在11月初, Oracle發布了一個有關即將推出的Java EE 7功能的小型社區調查 。 昨天結果公布了。 超過1,100名開發人員參加了調查,并且幾乎對每個問…

CSS(三)

CSS盒子模型 盒子模型解釋 元素在頁面中顯示成一個方塊,類似一個盒子,CSS盒子模型就是使用現實中盒子來做比喻,幫助我們設置元素對應的樣式。盒子模型示意圖如下: 把元素叫做盒子,設置對應的樣式分別為:盒…

一道關于運行順序題

function foo(){   getName function(){console.log(1)}   return this } foo.getName function(){console.log(2)} foo.prototype.getName function(){console.log(3)} var getName function(){console.log(4)} function getName(){console.log(5)} foo.getName()//2 …

android+小米文件管理器源碼,小米開源文件管理器MiCodeFileExplorer-源碼研究(2)-2個單實例工具類...

從本篇開始,講解net.micode.fileexplorer.util工具包中的類。這個包下的類,功能也比較單一和獨立。很多代碼的思想和實現,可以用于JavaWeb和Android等多種環境中。一、單實例活動管理器ActivitiesManager一個單實例的活動管理器,從…

移動優先的響應式布局

前面的話 隨著移動互聯網的興起,不同設備的分辨率相差較大,如果在不同的設置上顯示同一個頁面,則用戶體驗差。響應式網頁設計是一種方法,使得一個網站能夠兼容多個終端,而不用為每個終端制作特定的版本。它使得一個網站…

python中英文字符和中文字符存儲長度不同_Django如何正確截取中英混合字符串及表單中限制中文字符中長度...

中文字符和英文字符所占的字節長度是不一樣,一個是2個字節,一個是1個字節,這給我們用英文的web框架開發中文app帶來了麻煩。比如Django自帶過濾器truncatewords并不支持截取中文,另外模型中CharField中的max_length選項用于限制中…

使用RESTful客戶端API進行GET / POST

互聯網上有很多如何使用RESTful Client API的東西。 這些是基礎。 但是,盡管該主題看起來微不足道,但仍然存在一些障礙,尤其是對于初學者而言。 在這篇文章中,我將嘗試總結我的專業知識,以及我如何在實際項目中做到這…

南昌互聯網行業協會籌辦者祝真和華罡團隊-2014年12月江西IDC排行榜

他出自軍營,擁有一身正氣。 他在南昌創業,立意卓越。 從站點開始、到微營銷、到線上教育,全面開花。 他在朋友圈看到不對的內容,就會即時批評。 他對朋友,又是很的和藹可親。 他就是南昌華罡網…

Linux下查看某個進程的網絡帶寬占用情況

說明: 1、可能查看某個進程的帶寬占用需要明確知道PID、進程名字、發送速度、接收速度。 2、很遺憾,在Linux原生的軟件中沒有這樣的一款,只能額外裝,最符合以上的情況就只有nethogs。 3、nethogs可以指定網卡,但是不能…

android中的add方法,Android入門之addWindow

前面說到,應用程序添加窗口時,會在本地創建一個ViewRoot,然后通過IPC(進程間通信)調用WmS的Session的addWindow請求WmS創建窗口,下面來看看addWindow方法。addWindow方法定義在frameworks/base/services/java/com.android.server.…

CSS屬性速查表

前面的話 本文將按照布局類屬性、盒模型屬性、文本類屬性、修飾類屬性這四個分類,對CSS常用屬性進行重新排列,并最終設置為一份stylelintrc文件 布局類 1、定位 positionz-indextopbottomleftright 2、浮動 floatclear 3、多列布局 columnscolumns-width…

我應該使用32位還是64位JVM?

這是我在企業軟件開發生涯中多次遇到的問題。 我不得不每隔一段時間就提供有關配置特定新環境的建議。 而且,很多時候,手頭的問題與“我應該使用32位或64位JVM”有關。 老實說,一開始我只是擲硬幣。 而不是給出合理的答案。 (對不…