Android螢幕適配之使用布局別名

來源:互聯網
上載者:User

標籤:android開發   螢幕適配   布局別名   

轉載請註明出處: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有以下類型:

相關參考資料:

  1. http://developer.android.com/guide/practices/screens_support.html
  2. http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources
  3. http://blog.csdn.net/zhaokaiqiang1992/article/details/45419023

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android螢幕適配之使用布局別名

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.