標籤:android io 使用 ar for 檔案 sp 問題 on
由於不同手機的尺寸大小,螢幕解析度可能存在差異。在開發應用的時候,你或許遇到過這些的問題:
1, 為什麼圖片在另外的手機上顯示的時候變小了,又或是縮小了?
2, 為什麼在layout中定義好的格局在另外的手機上變形了?
3, 為什麼自己自訂的控制項尺寸顯示不正常了?
。。。。。。。。。。。。。。。。
這些都是android中比較常見的裝置相容性相關的問題,其實解決這類問題也不難,只要掌握了一些基本概念和android內部處理相容性問的機制,這些問題都可以迎刃而解。
下邊收集了一些關於尺寸相容性問題的一些基本知識和一些best practices, 希望對大家能有所協助
1,螢幕尺寸大小與密度參考值:
註解:1 inch = 2.5cm
密度基準: 160dpi
2, 螢幕尺寸與密度對照表:
3,px 與 dp 在不同解析度裝置上的轉換規則:
一, 假如裝置的尺寸是2英寸的,解析度是320,那邊它的密度為160dpi,也就是基本輔助線。這時:1px=1dp=1sp.
二, 假如裝置的尺寸是2英寸,解析度是480, 那麼它的密度是240/dp.這時:1.5px=1dp=1sp
換算規則px = dp(dpi/160).
這個可以解析為什麼用dp作為長度單位時,即使螢幕解析度發生變化,在不同的裝置上顯示的物理長度能保持一致。而用px作為單位時,在高解析度的裝置像變小,在低解析度的裝置像變大。
4,使用wrap_content, fill_parent, 或者 dp 來定義layout的尺寸大小。
使用dp來定義組件的尺寸的好處是:系統會根據裝置dpi自動轉換尺寸的大小。舉個列子,在密度為160dpi的機器上,假如你定義組件的尺寸是100dp,那麼顯示的實際大小就是100px。而在密度為240的機器上,系統會把它顯示成px=100 * (240/160) px= 150px大小的尺寸。通過這種轉換,可以達到在不同解析度的裝置上,對於同一個組件,顯示的物理尺寸是相同的,不會出現變大或者變小的情況。
5,不同密度裝置對應影像檔的最佳比例。
對於四種密度low-dpi, medium-dpi, high-dpi, extra high-hdpi的裝置,在指定一個相同的影像檔時,分配給各種密度的影像檔的尺寸應該符合以下比例:3:4:6:9. 也就是要符合密度比例(120:160:240:360).
舉個列子,假如我們要在一個密度為160dpi的裝置上使用到一個48 * 48的影像檔。那麼對於其它密度的裝置,我們要準備的影像檔分別是:
low-density (120dpi) : 36×36
medium-density(160dpi): 48×48
high-density (240dpi) : 72×72
high-density (360dpi): 96×96
6,在需要的情況下,為每種尺寸的裝置提供指定的layout檔案。
res/layout/my_layout.xml // layout for normal screen size (“default”)
res/layout-small/my_layout.xml // layout for small screen size
res/layout-large/my_layout.xml // layout for large screen size
res/layout-xlarge/my_layout.xml // layout for extra large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation
7, 在需要的情況下,為每種密度的裝置提供不同的影像檔.
res/drawable-mdpi/my_icon.png // bitmap for medium density
res/drawable-hdpi/my_icon.png // bitmap for high density
res/drawable-xhdpi/my_icon.png // bitmap for extra high density
8,不在layout檔案中使用px。
因為使用px後會在解析度不同的機器上顯示成不同的物理尺寸。
9,不使用absoluteLayout 布局。
因為絕對布局需要指定絕對位移量,在尺寸不同的機器上,可能出現問題。
,10,如何讓我們自己寫的控制項可以配置長度和自適應所有裝置:
在所有自訂控制項中,都不要寫入程式碼長度,寬度等尺寸;應該先根據基準160dpi調式得到控制項在標準基準下控制項的最佳值,假如設為width。然後通過density = getResources().getDisplayMetrics().density 擷取當前裝置相對於基準的縮放值,然後得到一個最佳值value = width * density. 在用這個值去繪製控制項的UI。這樣我們就可以在設定檔中隨時改動控制項的大小。
註解:density = getResources().getDisplayMetrics().density
這個值在不同密度的裝置中返回不同的值:
160dpi:1
240dpi: 1.5
120dpi: 0.75
….類推
android最佳實務之裝置相容性