背景
做移動(dòng)App開發(fā)的同學(xué),應(yīng)該都被分辨率相關(guān)的概念或適配問題困擾過。甚至于設(shè)計(jì)人員哼凯,面對技術(shù)提到的dp欲间,dip,sp等詞匯時(shí)断部,也許也要懵上一會(huì)猎贴。在此,對開發(fā)中常用的一些概念做一個(gè)梳理家坎。
基礎(chǔ)概念
- 英寸(inch)
是英制的長度單位,1inch=2.54cm
我們通常用英寸來描述手機(jī)屏幕的尺寸吝梅。如iPhone6屏幕尺寸為4.7英寸虱疏,iPhone 6 Plus屏幕尺寸為5.5英寸,指的是顯示屏對角線的長度苏携。如下圖:
- 像素(Pixel)
百科上給的定義做瞪,指基本原色素及其灰度∮叶常可以理解為屏幕上的一個(gè)最小物理顯示單位装蓬。無論代碼里使用哪一種單位,最終都要轉(zhuǎn)化為像素單位纱扭,并顯示出來牍帚。
- 屏幕像素密度 ppi(Pixels Per Inch)
由它的名稱可以看出,ppi指每英寸長度上含有的像素?cái)?shù)目乳蛾。只是這里的測量方式是沿著對角線的暗赶。
那ppi怎么算出來呢?其實(shí)就是很簡單的一個(gè)勾股定理公式:
舉個(gè)例子肃叶,iPhone 5的分辨率是640px*1136px, 屏幕為4inch蹂随,代入上述公式可得到ppi=326。
- dpi(Dot Per Inch)
dpi指每英寸有多少個(gè)點(diǎn)因惭。對手機(jī)岳锁、平板屏幕來說,dpi=ppi
iOS中的尺寸單位
pt 即point蹦魔,是iOS里繪圖時(shí)坐標(biāo)系使用的抽象單位激率。我們應(yīng)該把它和排版印刷中的point單位區(qū)別開來。
iPhone 3GS手機(jī)的邏輯分辨率是320pt *480 pt勿决,屏幕的實(shí)際物理分辨率是320px * 480px柱搜,所以1pt剛好對應(yīng)1px;
-
到了iPhone 4剥险,蘋果采用了Retina的顯示技術(shù)聪蘸,邏輯分辨率仍然是320pt * 480 pt,物理分辨率變成了640px * 960px (326ppi), 意味著1pt會(huì)被渲染為2*2的像素矩陣。如下示意圖:
iOS中的scale(縮放因子)健爬,闡述了pt與px之間的一個(gè)映射關(guān)系:
1 point = scale * pixel
(3GS的scale=1控乾, iPhone4、5娜遵、6的scale=2, iPhone 6 Plus的scale = 3)
對于iPhone 6 Plus機(jī)型蜕衡,邏輯分辨率選用了414pt * 736pt,按照scale=3來計(jì)算设拟,完美1:1映射的設(shè)備物理分辨率應(yīng)該是1242px * 2208px慨仿。但實(shí)際上手機(jī)的物理分辨率沒有那么大(1080px * 1920px),個(gè)中緣由我們就不探討了纳胧,對開發(fā)者來說镰吆,就按照@3x來準(zhǔn)備素材,剩下的工作由渲染時(shí)自動(dòng)壓縮完成跑慕。具體可參考如下鏈接中的一張示意圖 https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
Android中的尺寸單位
大家都知道Android生態(tài)圈內(nèi)的設(shè)備碎片化比較嚴(yán)重万皿,出現(xiàn)了各種分辨率的屏幕。如果按屏幕密度(即ppi)來劃分核行,廣義上可以分為四種大欣喂琛:低(120ppi)、中(160ppi)芝雪、高(240ppi)和超高(320ppi)减余。
- dp,也叫dip惩系,Density-independent Pixels的簡寫佳励,字面意思就是密度無關(guān)的像素單位。dp是基于屏幕密度的一個(gè)抽象單位蛆挫,這點(diǎn)上跟iOS里的pt本質(zhì)上其實(shí)是一樣的赃承。Android引入這個(gè)概念,也就是為了解決在不同ppi的設(shè)備上悴侵,能夠得到相同的顯示效果瞧剖。
之前我們講到,任何單位顯示時(shí)都要轉(zhuǎn)化為像素Pixel可免。那么dp和px的換算關(guān)系是怎樣的呢抓于?
px=dp*ppi/160
即在160ppi的屏幕上,1dp=1px浇借;而320ppi的屏幕上捉撮,1dp=2px,可以理解為1dp的單位將以2個(gè)像素來渲染妇垢。
屏幕密度(ppi) | dp | px |
---|---|---|
mdpi(160ppi) | 1 | 1 |
hdpi(240ppi) | 1 | 1.5 |
xhdpi(320ppi) | 1 | 2 |
xxhdpi(480ppi) | 1 | 3 |
- sp巾遭,Scale-independent Pixels肉康,是google建議的對字號使用的單位,比如在TextView里灼舍。為什么有了dp吼和,還要引入sp呢?因?yàn)锳ndroid允許用戶在“設(shè)置"里自定義文字尺寸大小(比如小骑素,標(biāo)準(zhǔn)炫乓,大,超大献丑,特大)末捣。如果App功能上需要和系統(tǒng)這里的字號設(shè)置有聯(lián)動(dòng)關(guān)系,那使用sp就有意義了创橄。實(shí)際開發(fā)中箩做,如果沒有這個(gè)必要,字號的地方使用dp也是沒問題的筐摘。
以上簡單總結(jié)了iOS和Android實(shí)際開發(fā)中的尺寸單位的概念卒茬。有不正之處船老,歡迎指正咖熟。