轉載請注明出處:http://blog.csdn.net/footballclub/
前言
我們在平時的Android開發中總是會遇到螢幕适配的問題,接下來我會介紹下出現的問題以及為什麼要使用布局别名。
基本概念和知識點
分辨率:整個螢幕的像素點的個數,常見的有1280*720,1920*1080
螢幕密度:表示機關面積内的像素個數,通常用dpi為機關,即每英寸多少個像素點
px:像素機關,螢幕上像素點的大小不是固定的,像素點可大可小
dp:長度機關,與具體螢幕密度無關,顯示的時候根據具體平台螢幕密度的不同最終轉換為相應的像素長度,具體轉換規則是: 1px = (目标螢幕密度/标準密度)*dp,标準密度為160dpi,例如,1dp長度在密度為160dpi的平台表示一個像素的長度,而在240dpi的平台則表示1.5個像素的長度
螢幕尺寸:螢幕的大小,通常用螢幕對角線的長度表示,螢幕的大小和螢幕的分辨率沒有必然關系,也就是說大螢幕的手機的分辨率不一定比小螢幕手機的分辨率大。
問題背景
下表介紹了螢幕密度和分辨率的關系對照表
名稱 | 螢幕密度 | 通常分辨率 |
---|---|---|
mhdpi | ~160dpi | 320*480 |
hdpi | ~240dpi | 480*800 |
xhdpi | ~320dpi | 720*1280 |
xxhdpi | ~480dpi | 1080*1920 |
xxxhdpi | ~640dpi | 1440*2560 |
通常螢幕密度和分辨率的關系都是這樣,但也有一些奇葩的機型不是按照這個标準來的,這個時候就需要我們單獨做适配了。譬如說分辨率同樣是1280*720的手機,按道理來說,他們的螢幕密度應該是320dpi,但兩者的螢幕密度卻分别是320dpi和240dpi,很明顯240dpi的手機是個奇葩,那麼問題就出現了:
螢幕密度是240dpi的手機,他的寬度有720/(240/160)=480dp,而正常的,320dpi的手機的寬度則隻有360dp。那麼同樣160dp的寬度在兩者螢幕上面所占的比例分别是1/3和1/2,這樣就導緻了160dp在240dpi的手機上看起來會小很多,接下來會介紹怎麼簡單的來解決這個問題。
最小寬度限定符
android3.2以後,可以通過使用最小寬度限定符來為不同螢幕提供精确的布局。使用方式:swdp,如layout-sw600dp, values-sw600dp。這裡的sw代表smallwidth的意思,當你所有螢幕的最小寬度都大于600dp時,螢幕就會自動到帶sw600dp字尾的資源檔案裡去尋找相關資源檔案,這裡的最小寬度是指螢幕寬高的較小值,每個螢幕都是固定的,不會随着螢幕橫向縱向改變而改變。
是以我們可以寫個values-sw480dp的檔案,然後在檔案裡設定要使用的值240dp,這樣一來240dpi的手機使用的dp值就為240了,效果也就和320dpi上面差不多了。
但是這裡有個問題,就是上面說的最小寬度限定符隻在android3.2以後才被引入,是以要做3.2之前的設配這樣做還是不夠的。
- xlarge screens are at least 960dp x 720dp
- large screens are at least 640dp x 480dp
- normal screens are at least 470dp x 320dp
- small screens are at least 426dp x 320dp
是以添加values-large.xml也能解決問題。有的人可能說了,既然values-large.xml這樣能解決問題,那麼為什麼還要使用最小寬度限定符呢?嗯… 是這樣的:
在版本低于 3.2 的 Android 裝置上,開發人員遇到的問題之一是“較大”螢幕的尺寸範圍,該問題會影響戴爾 Streak、早期的 Galaxy Tab 以及大部分 7 英寸平闆電腦。即使這些裝置的螢幕屬于“較大”的尺寸,但很多應用可能會針對此類别中的各種裝置(例如 5 英寸和 7 英寸的裝置)顯示不同的布局。這就是 Android 3.2 版在引入其他限定符的同時引入“最小寬度”限定符的原因。
是以我們應該保留這兩種方式,但是這樣的話,就會出現重複,而且當不是240dp的時候,還得分别打開兩個檔案來修改,非常麻煩,是以這個時候就可以使用布局别名來解決這個問題。
布局别名
首先在values/dimens.xml中有個值width,為160dp
<dimen name="width">160dp</dimen>
<dimen name="width_sw480">240dp</dimen>
我們需要在240dpi的手機上把值設為240dp,使用布局别名的方式來實作。分别建立values/large/dimens.xml和values/sw480dp/dimens.xml,其中的檔案内容都一樣
<item name="width" type="dimen">@dimen/width_sw480</item>
這裡的意思就是為width提供别名width_sw480,這樣在240dpi的手機上就會使用width_sw480所指定的值了,以後修改也隻需改動一處,非常友善。
當然布局别名也不僅限于dimens,也可用于layout,strings等檔案,使用何種類型的布局别名是通過指定type來實作的,type有以下類型:
相關參考資料:
- http://developer.android.com/guide/practices/screens_support.html
- http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources
- http://blog.csdn.net/zhaokaiqiang1992/article/details/45419023