Ⅰ 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就可以達到完美的顯示效果。
Ⅱ Android是怎樣匹配資源的
針對大多數APK應用程序,開發人員都會提供各種不同的資源。比如對於同一張圖片image.png,我們通常會提供高解析度,中解析度和低解析度三個版本。
res/它們都必須以相同的名字存儲在各個drawable目錄下。當應用程序運行時,系統會根據當前設備的實際解析度來選擇最佳的資源。
那麼系統運行時如何動態選擇最合適的資源來使用呢?
理解最佳資源的匹配過程至少有兩個好處:
理解最佳資源匹配過程之前,我們先來看一下資源標簽的屬性和優先順序。所謂優先順序順序指的是Android規定的資源標簽屬性的優先順序。
其實除了解析度外,同種資源之間還可以有下面許多資源屬性標簽,它們在匹配過程中是有優先順序順序的。
以下資源標簽修飾語按照優先順序從高到低的順序排列。
MCC和MNC
MCC(Mobile Country Code)和MNC(Mobile Network
Code)是網路運營商的全球唯一編號。其中MCC指國家碼,MNC指網路號。
例如,MCC-310屬於美國,MCC-460屬於中國。460-00代表中國移動,460-01代表中國聯通。一般情況下,SIM卡中存有此卡的主歸屬地。
用作資源標簽時,可以同時使用MCC和MNC
組合,也可以只使用MCC。例如,mcc460,mcc460-mnc00。程序編碼時,可以使用Configuration類中的mcc和mnc屬性來獲取當前設備的這兩個值。
語言和地區
Android系統採用ISO
639-1國際語言碼,由兩個字母組成。地區代碼遵循3166-1-alpha-2標准執行,也由兩個字母組成,是可選的。如何組合使用需要加」r」.例如en表示英語,fr表示法語,en-rUS表示英語和美國地區。程序中可以通過Configuration類的locale屬性值來獲取當前設備的語言地區信息。
最小寬度(Smallest Width)
格式為 sw<N>dp
例如用res/layout-sw600dp來標志自己的布局資源,相當於告訴系統,屏幕的可顯示尺寸必須在任何時刻都大於600dp(不管橫屏還是豎屏),才可以使用這一資源。與設備語言值不同的是,設備最小寬度不會隨系統設置的變化而改變,它是固定的。
可以在AndroidManifest.xml中,通過指定"android:requiresSmallestWidthDp"屬性值來表示此程序要求的最小寬度值。代碼中可以通過Configuration類中的smallestScreenWidthDp成員變數來獲取當前設備的最小寬度值。
可用寬度(Available Width)
格式為 w<N>dp
設備的可用寬度值隨著當前是橫屏還是豎屏會產生變化,即它表示的是當前真實的寬度值。如果多種可選資源中都採用了這一標簽修飾,那麼系統會自動選擇一個最接近於(但不超過)當前值得資源。
例如w720dp,代碼中可以通過Configuration類的screenWidthDp成員變數來獲取當前的可用寬度值。
可用高度(Available Height)
格式為:h<N>dp
和可用寬度表達含義類似,只不過這里值高度。代碼中可以通過Configuration類的screenHeightDp成員變數來獲取當前的可用寬度值。
屏幕大小(Screen Size)
Android設備尺寸眾多,大致將屏幕尺寸分為以下幾類:
代碼中通過Configuration類中的screenLayout成員變數來獲取當前設備的屏幕大小。
屏幕寬高外觀(Screen Aspect)
指的是當前屏幕的寬高比(aspect ratio)。分為以下兩種
nolong
非長屏幕,如QVGA,HVGA,VGA等。
可以通過Configuration類中的screenLayout成員變數來獲知屏幕是否為長屏。
屏幕方向(Screen Orientation)
分為兩種,豎屏(port)和橫屏(land)。
這個值會隨著用戶的操作而變化,但我們可以通過Configuration類中的orientation成員變數來獲知當前設備的屏幕方向。
UI模式(UI mode)
分為以下幾種:car,desk,television,appliance.
表示設備被放置在底盤(dock)時的模式,如汽車上的手機托盤,桌面托盤等。這個模式會隨著用戶的操作而改變,可以通過UiModeManager來開啟和關閉這一功能。
夜間模式(Night Mode)
分為兩種,night(處於夜間模式)和notnight(非夜間模式)。
可以通過UiModeManager來開啟和關閉這一功能。
屏幕像素密度(dpi)
觸摸屏類型(Touchscreen Type)
分為notouch(設備不帶觸摸屏)和finger(觸摸屏通過手指操作)。
通過Configuration類中的touchscreen成員變數來獲知當前設備的觸摸屏類型。
鍵盤可用性
分為以下三種狀態
這個值在運行過程中會發生變化,可以通過Configuration類的hardkeyboardHidden和keyboardHidden變數來獲知當前狀態。