ppiandroid
⑴ Android中常見的單位ppi,dp,dpi,sp,px
在android 開發過程中,我們使用的單位比較少,一般情況下在描述字體大小的時候我們通常用sp,而在設置間距的時候我們用dp,除此之外很少再用到其他單位,而且很多時候我們用著用著就習慣了,也不去探究為什麼這么寫,可不可以用其他單位,每個單位到底代表著什麼意思,所以說,習慣真的很可怕呀。今天,我們就來一探究竟,看看這些單位背後的含義。
像素即是屏幕上顯示數據的最基本的點,在PS裡面也是其最根本的單位,所有的圖形都是在此基礎上生成的,平時我們經常講的手機屏幕解析度就是以像素作為單位的,比如在android中我們經常說的手機像素是1080X1920,其實它所表達的意思是在該手機上面在橫向上面有1080個像素點,在縱向上有1920個像素點。
在android中用來形式字體大小的單位,正常情況下會按照手機系統設置的文本大小來顯示文字,但是同時也會與系統設置的文本保持一致,比如在有些老年機上面為了更好的操作手機有些人會將字體設置為較大字體,這個時候使用sp作為單位的字體也會隨之變大,但是如果將字體大小的單位設置為dp,則不會隨著系統字體的變化而變化。
在每次的手機廠商新品發布會上,我們都會聽到關於手機的介紹,比如手機的屏幕解析度,多大尺寸等等。而當我們知曉一個手機的屏幕分辯率和手機尺寸的時候,就可以計算出手機的物理像素密度,其計算公式為:
需要注意的是,PPI是Android手機物理像素密度,而非在Android開發過程中我們經常說到的像素密度。
屏幕密度與dpi密切相關,dpi是每英寸的點數。也就是說,密度越大,每英寸內容納的點數就越多。
在android.util包下有個DisplayMetrics類可以獲得密度相關的信息。最重要的是densityDpi這個成員,它有如下幾個常用值:
DENSITY_LOW = 120
DENSITY_MEDIUM = 160 //默認值
DENSITY_TV = 213 //TV專用
DENSITY_HIGH = 240
DENSITY_XHIGH = 320
DENSITY_400 = 400
DENSITY_XXHIGH = 480
DENSITY_XXXHIGH = 640
dpi的值主要是通過displayMetrics獲取的,獲取方式為:
val densityDpi = resources.displayMetrics.densityDpi。
dp和dip是一樣的,設備獨立像素,這個和設備硬體有關,不同設備有不同的顯示效果。而通常在做android項目的時候,為了適配市場上面眾多的手機屏幕分辯率,我們一般都會採用dp。dp是Android基於物理設備的PPI抽象出來的一個單位。它是以160dpi的屏幕為基準定義的,在160dpi的屏幕上1dp=1px,那麼由此我們就可以得出其計算公式:
換算公式:1dp = (屏幕ppi/160)px或者是px = (屏幕ppi/160)*1dp。舉個例子:假設ppi = 320,那麼1dp = 2px。
下面我們來演練一下:
如圖所示,手機的屏幕分辯率為1080X1920,尺寸為5寸,從而計算得出PPI的值為440,再通過PPI計算出1dp 約等於3px。假設現在美工給的圖上面有一個a圖標,距離頂部的距離為30px,那麼根據最終我們的換算結果可知,我們設置為10dp就可以達到完美的顯示效果。
⑵ iOS、Android等開發中px、ppi、pt、pd、dpi的個人理解
作為一名iOS開發者,以前對這些概念懵懵懂懂,最近看了很多資料記錄下對這些概念的理解,主要以iOS和Android平台為切入
在iphone3gs的時候,屏幕的解析度為320x480px、ppi =164 ,這時蘋果把iOS系統的邏輯解析度也設計為320x480pt 、dpi = 164 ,並且後面一值遵循這個UI設計規范(1pt 的大小約等於ppi為164的情況下單個像素的大小)。在沒有出現plus及iphonex系列的之前的設備的都是dpi≈164, 1pt 的物理大小是固定的,但對應的像素有可能不一樣,後期出現的plus及iphonex系列的dpi都比164小一點點,所以1pt的大小也對應的有變大一點點,但是這變化是很小的,應該是蘋果系統級別的大屏適配吧 。
蘋果的設計規范一直是在保持dpi基本不變的情況下,設備解析度和邏輯解析度的是整數倍的縮放關系,但是在plus系列中,雖然開發的時候我們使用@3倍關系做設計開發,但是實際上他們之間是沒有@3倍關系的,實際的縮放應該是@2.6倍,那為什麼蘋果不按照規范來呢,這個我也不知道,但是可以分析一下如果蘋果嚴格按照@3倍來應該是怎樣的。
可能因為Android的開源屬性和終端太亂太雜,讓安卓不能像iOS那樣對於不同的設備在系統級別設置邏輯解析度來方便開發者開發,但是Android也有很好的解決方案就是使用pd作為邏輯解析度,從pd定義可知(幕像素點密度為160ppi時1px長度),pd是個固定的物理大小單位。因此如果以pd計算dpi的話,那dpi在不同設備上應該是一樣的160dpi,和iOS以dpi≈164基本差不多,所以在Android、iOS設計開發的時候才會把他們兩等同。
android圖