px、dp、dpi、densityandroid
px 就不解釋了,下面解釋下其餘參數post
dpi:就是每英寸包含的像素的多少。爲何是英寸,不是釐米?由於是外國人定義的。設計
第一代andrid設備的dpi是160 cdn
可是隨着高分辨率的屏幕出現,每英寸中包含的像素遠遠不止160個,出現了240,320等屏幕。
爲了兼容這些高分辨率的屏幕,因而定義了density 和dp 這兩個參數。blog
用dpi=320舉例
以第一代android設備的dpi爲標準,density = 1
在dpi=320的設備上,density=2,即 density= 當前設備的dpi / 160(第一代android設備的dpi)圖片
單獨的density 好像沒啥用,就是一個當前設別和第一代android設備dpi的比值。
因此,還有一個參數dp
dp,dp是android中與屏幕密度無關的單位,使用dp能夠不用關心當前設備的dpi究竟是多少。
爲何dp有這種功能?看看dp的定義: dp = px * densityget
因此,在dpi=160的設備上,density=1,1dp = 1px;
在dpi=320的設備上,density=2,1dp = 2px;it
這樣,使用dp作爲單位,就不用擔憂屏幕當前的dpi究竟是多少了io
使用density+dp這種方式很好的解決的dpi不一致,沒法統一使用px去繪製各類UI的問題。可是卻沒有解決 UI設計圖和真實顯示不一致的問題。class
例如,如今市面上出現了各類奇奇怪怪的寬高比,16:9,4:3,22:19,23:19等等等等。
這些各類的寬高將會致使這樣的問題:
公司的UI基於480dp x 360dp 這樣的寬高的設計了交互圖,是4:3 。
可是若是遇到了 640dp x 360dp 這種16:9的分辨率,就有問題了,很明顯,原來設計圖的高度爲480dp,在4:3的手機上能夠鋪滿,在16:9的機子上就鋪不滿了。因此須要屏幕適配。
通常來講,屏幕適配只能適配一個方向,豎直方向或者水平方向。 適配的方法有不少,介紹一種我比較喜歡的方法:今日頭條適配方法。juejin.im/post/5b7faf…
這種方案是經過動態修改density來實現的,簡單介紹一下。
例子 :設計圖 480dp x 360dp
適配方向:豎直適配,使得 480dp的顯示效果爲任意屏幕高度。
假設屏幕高度爲 h ,存在一個density 使得 480dp * density = h , density = h / 480。咱們只要把這個density設置到Resource的DisplayMetrics裏面就能夠完成豎直方向的適配了。