dpi 满粗、 dip 辈末、分辨率、屏幕尺寸映皆、px挤聘、density 關系以及換算
一、基本概念
dip ? ? ? ?: Density?independent pixels 捅彻,設備無關像素组去。
dp ? ? ? ?:就是dip
px ? ? ? ?: 像素
dpi:dots per inch , 直接來說就是一英寸多少個像素點步淹。常見取值 120从隆,160,240缭裆。我一般稱作像素密度键闺,簡稱密度
density: 直接翻譯的話貌似叫 密度。常見取值 1.5 澈驼, 1.0 辛燥。和標準dpi的比例(160px/inc)
分辨率 ? : 橫縱2個方向的像素點的數(shù)量,常見取值 480X800 缝其,320X480
屏幕尺寸: 屏幕對角線的長度挎塌。電腦電視同理。
屏幕比例的問題内边。因為只確定了對角線長榴都,2邊長度還不一定。所以有了4:3假残、16:9這種缭贡,這樣就可以算出屏幕邊長了。
二辉懒、應用
在android里面阳惹,獲取一個窗口的metrics,里面有這么幾個值
metrics.density;
metrics.densityDpi;
densityDpi : 就是我們常說的dpi眶俩。
density ? ? ?: ?其實是 DPI / (160像素/英寸) 后得到的值莹汤。是不是有點奇怪,因為我?guī)Я藛挝坏哂 8倭搿Dㄖ瘛_@個涉及到后面一個比較重要的東西,后面再說止潮。
從上面就看得出了窃判,DPI本身的單位也是 像素/英寸,所以density其實是沒單位的喇闸,他就是一個比例值袄琳。
而dpi的單位是 像素/英寸,比較符合物理上面的密度定義燃乍,密度不都是單位度量的值么唆樊,所以我更喜歡把dpi叫像素密度,簡稱密度刻蟹,density還是就叫density逗旁。
三、各單位間轉換
1. 計算dpi
比如一個機器舆瘪,屏幕4寸片效,分辨率480X800,他的dpi能算么介陶。
因為不知道邊長堤舒,肯定不能分開算色建,4是對角線長度哺呜,那直接用勾股定理算對角線像素,除以4箕戳,算出來大概是 dpi = 233 像素/英寸某残。
那么density就是 (233 px/inch)/(160 px/inch)=1.46 左右
順帶說下,android默認的只有3個dpi陵吸,low玻墅、medium和high,對應 120壮虫、160澳厢、240,如果沒有特別設置囚似,所有的dpi都會被算成這3個剩拢,具體可以參考下這個帖子
http://android.tgbus.com/Android/tutorial/201103/347176.shtml
其中的default就是160。
2. 計算?dp 與 px
我們寫布局的時候饶唤,肯定還是要知道1個dp到底有多少px的徐伐。
換算公式如下: dp = (DPI/(160像素/英寸))px = density px
注意,這里都是帶單位的募狂。px是單位办素,dp是單位角雷,density沒單位。
為了方便性穿,假設dpi是240 像素/英寸 勺三, 那么density就是1.5
那么就是 dp=1.5px ,注意這是帶了單位的需曾,也就是 設備無關像素 = density 像素
那么轉換為數(shù)值計算的話檩咱,應該是下面這個式子
PX = density * DP
也就是
像素值 = density * 設備無關像素值 ,?請注意這里有個值字胯舷。
3. 為啥 標準dpi = 160
(1)Android Design [1] 里把主流設備的 dpi 歸成了四個檔次刻蚯,120 dpi、160 dpi桑嘶、240 dpi炊汹、320 dpi
實際開發(fā)當中,我們經(jīng)常需要對這幾個尺寸進行相互轉換(比如先在某個分辨率下完成設計逃顶,然后縮放到其他尺寸微調后輸出)讨便,一般按照 dpi 之間的比例即 2:1.5:1:0.75 來給界面中的元素來進行尺寸定義。
也就是說如果以 160 dpi 作為基準的話以政,只要尺寸的 DP 是 4 的公倍數(shù)霸褒,XHDPI 下乘以 2,HDPI 下乘以 1.5盈蛮,LDPI 下乘以 0.75 即可滿足所有尺寸下都是整數(shù) pixel 废菱。
但假設以 240 dpi 作為標準,那需要 DP 是 3 的公倍數(shù)抖誉,XHDPI 下乘以 1.333殊轴,MDPI 下乘以 0.666 ,LDPI 下除以 2
而以 LDPI 和 XHDPI 為基準就更復雜了袒炉,所以選擇 160 dpi
(2)這個在Google的官方文檔中有給出了解釋旁理,因為第一款Android設備(HTC的T-Mobile G1)是屬于160dpi的。
四我磁、 示例分析
1. 屏幕尺寸(screen size)
就是我們平常講的手機屏幕大小孽文,是屏幕的對角線長度,一般講的大小單位都是英寸夺艰。
比如iPhone5S的屏幕尺寸是4英寸芋哭。Samsung Note3是5.7英寸。
圖 1
2.像素(pixel)
想像把屏幕放大再放大劲适,對楷掉!看到的那一個個小點或者小方塊就是像素了。
圖 2
3.分辨率(Resolution)
是指屏幕上垂直方向和水平方向上的像素個數(shù)。
比如iPhone5S的分辨率是1136*640烹植;Samsung Note3的分辨率是1920*1080斑鸦;
圖 3
4.dpi
是dot per inch的縮寫,就是每英寸的像素數(shù)草雕,也叫做屏幕密度巷屿。這個值越大,屏幕就越清晰墩虹。
iPhone5S的dpi是326嘱巾;?Samsung Note3 的dpi是386
圖 4
5.dip
是Density independent pixel的縮寫,指的是抽象意義上的像素诫钓。跟設備的屏幕密度有關系旬昭。
它是Android里的一個單位,dip和dp是一樣的菌湃。
Google的官方說明是這樣的:
Density-independent pixel (dp)
A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.
The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium" density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application's UI, to ensure proper display of your UI on screens with different densities.
就是說在160dpi的屏幕上问拘,1dip=1px。
它跟屏幕密度有關惧所,如果屏幕密度大骤坐,1dip代表的px就多,比如在320dpi的屏幕上下愈,1dip=2px纽绍。
為什么我們在布局的時候最好要用dip,不要用px势似?
是因為這個世界上存在著很多不同屏幕密度的手機拌夏,屏幕密度是什么?就是dpi叫编,就是單位長度里的像素數(shù)量辖佣。
想象一下霹抛,如果這些手機的尺寸一樣搓逾,屏幕密度相差很大,那么是不是說一個手機水平方向上像素很少杯拐,另一個手機水平方向上像素很多霞篡?那我們畫同樣pix數(shù)量的時候,它顯
示的長度不就會不一樣了端逼?
比如下面圖中的兩個手機朗兵,同時設置2px長度的Button,在屏幕密度較高的手機里就會顯示的比較小顶滩。
而同時設置的2dip長度的Button余掖,在兩個手機上顯示的大小是一樣的。
圖 5
所以如果你在App布局中都用的px作為單位礁鲁,那么你的App跑在各個設備上就會出現(xiàn)奇奇怪怪的現(xiàn)象了盐欺。
來看一下emulator上的效果赁豆,我定義了兩個Button,分別用px和dip做單位冗美。
布局文件里這樣寫
? ?
顯示的界面是這樣的:
圖 6
getResources().getDisplayMetrics().densityDpi 就是屏幕密度魔种。
getResources().getDisplayMetrics().density 也可以理解為1dip相當于多少個px啦。
上面的dpi是240粉洼,1dip=1.5px
你看节预,100dip的Button是100pxButton的1.5倍長吧。