Android -- 屏幕適配

Android Drawable

一個Android項目有不少drawable文件夾,分別對應不一樣的dpiandroid

  • drawable-ldpi (dpi=120, density=0.75)
  • drawable-mdpi (dpi=160, density=1)
  • drawable-hdpi (dpi=240, density=1.5)
  • drawable-xhdpi (dpi=320, density=2)
  • drawable-xxhdpi (dpi=480, density=3)

Android SDK會自動屏幕尺寸選擇對應的資源文件進行渲染,如SDK檢測到你手機dpi是160的話會優先到drawable-mdpi文件夾下找對應的圖片資源,注意只是優先,假設你手機dpi是160,可是你只在xhpdi文件夾下有對應的圖片資源文件,程序同樣能夠正常運行。因此理論上來講只須要提供一種規格的圖片資源就ok了,若是隻提供ldpi規格的圖片,對於大分辨率的手機若是把圖片放大就會不清晰,因此須要提供一套你須要支持的最大dpi的圖片,這樣即便用戶的手機分辨率很小,這樣圖片縮小依然很清晰。ios

xhdpi

目前市面上最廣泛的高端機的分辨率還多集中在720X1080範圍,也就是多集中在xhdpi,因此目前來看xhpdi規格的圖片成爲了首選。iphone

利用IOS設計資源

iPhone5的屏幕分辨率爲640X1164, 屏幕尺寸爲4英寸,根據勾股定理(a^2 + b^2 = c^2)640^2+1164^2=1764496, 而後再對其開根號可求出屏幕對角線的分辨率爲:1328,除以4可得出iphone5的dpi:1328/4≈332 能夠看出iPhone5的屏幕的dpi約等於320, 恰好屬於xhdpi, 直接把iPhone5的那一套切好的圖片資源放入drawable-xhdpi文件夾裏就ok了。ide

wrap_content VS dp

全是xhdpi的資源的話,那麼你用wrap_content徹底沒有問題,Android會自動爲其餘規格的dpi屏幕適配,好比你在xhdpi放了一張120X120px大小的圖片,那麼在在hdpi屏幕上顯示的就只有120/2*1.5=90px大小,可是若是你不當心一樣把這張圖片也放入了mdpi了,這個時候用wrap_content顯示就會有問題。佈局

例如假設你只在drawable_xhdpi文件夾下放了test圖片,xhdpi的設備會去xhdpi文件夾下找到test圖片並直接顯示,而mdpi的設備優先會去mdpi文件夾裏查找test圖片,可是沒找到,最後在xhdpi文件夾下找到,而後會自動根據density計算並縮放顯示出來,實際顯示出來的大小是120/2=60px, 因此總體的顯示比例纔會看起來比較正常設計

  • mdpi

  • xhdpi

可是若是你在mdpi文件夾裏也放入了一樣的圖片,那麼mdpi的設備會直接去mdpi文件夾裏尋找到test圖片,並直接顯示,而這時候顯示不會縮放,實際顯示大小就是120X120,在mdpi的屏幕上看起來就會比較大,如圖:
code

最小寬度限定詞

當你的設備的最小寬度等於600dp或者更大時,系統選擇layout-sw600dp/main.xml(two_panes)的佈局,而小一點的屏幕則會選擇layout/main.xml(single_panes)的佈局。xml

避免出現重複的佈局文件

layout-sw600dp和layout-xlarge同時存在,創建不一樣的values文件夾的layout.xmlblog

好比有一個佈局要兼容大小屏幕,在Activity中引入的佈局名字爲activity_my_schedule:圖片

在 res文件夾下建立不一樣的 values文件夾,來指向同一佈局文件

res/values/layout.xml

<resources>
    <item name="activity_my_schedule" type="layout">@layout/activity_my_schedule_wide</item>
</resources>

res/values-sw600dp\layout.xml

<resources>
    <item name="activity_my_schedule" type="layout">@layout/activity_my_schedule_wide</item>
</resources>

你能夠只使用一個layout佈局文件,在 res文件夾下建立不一樣的 values文件夾,來指向不一樣的局文件。

咱們來看Google開源項目Iosched中的實際應用,在layout下面有兩個佈局文件,分別用於適配大小屏幕:

res/layout/activity_my_schedule_wide

res/layout/activity_my_schedule_narrow

建立不一樣的values文件夾的layout,layout用於小屏幕,values-sw600dp-land用於橫屏的狀況:

res/values/layout.xml

<resources>
    <item name="activity_my_schedule" type="layout">@layout/activity_my_schedule_narrow</item>
</resources>

res/values-sw600dp-land\layout.xml

<resources>
    <item name="activity_my_schedule" type="layout">@layout/activity_my_schedule_wide</item>
</resources>

更復雜的需求,不一樣的狀況選擇不一樣的佈局,只須要在res下面創建不一樣的values的layout,引用指定的佈局名稱便可,常見的values類型有:

  • res/values/layouts.xml
  • res/values-sw600dp-land/layouts.xml
  • res/values-sw600dp-port/layouts.xml
  • res/values-xlarge-land/layouts.xml
  • res/values-xlarge-port/layouts.xml

使用點9圖片

若是你在使用組件時能夠改變圖像的大小,你很快就會發現這是一個不明確的選擇,由於運行的時候,圖片會被拉伸或者壓縮(這樣容易形成圖像失真)。

避免這種狀況的解決方案就是使用點9圖片,這是一種可以指定哪些區域可以或者不可以拉伸的特殊png文件。

我是天王蓋地虎的分割線

相關文章
相關標籤/搜索