Android屏幕適配(基於實戰考慮「Android圖片應該用多大,放在什麼密度下面,可否用一套圖適配」的問題)

首先上個最新的Android分辨率統計的圖:
圖片描述ios

從上圖咱們經過計算能夠得出,目前的設備前四個佔據大份額(77.6%)的分辨率的手機的屏幕長寬都是按照比例縮放的。app

1.Android系統的圖片尋找機制對放在xhdpi,xxhdpi等不一樣密度的圖片會根據手機的密度尋找最合適的文件夾下的圖片,而後進行根據密度的比率進行放大,縮小處理。
2.意味着一張背景圖若是是7201280的大小的話,放在上述分辨率的手機上都是能夠無變形縮放的。目前咱們的設計師大多狀況都是按照ios的手機來設計界面的,主流是按照iphone6(7501334)
一計算,你也會發現,這個也是和上述主流的分辨率長寬也是對應的比率關係。less

結論:咱們設計師若是按照iphone6設計屏幕的話,Android是能夠一套圖片就能夠達到界面的適配,
只不過放在xhdpi或者xxhdpi下面,Android SDK會自動屏幕尺寸選擇對應的資源文件進行渲染,如SDK檢測到你手機dpi是320的話會優先到drawable-xhdpi文件夾下找對應的圖片資源,注意只是優先,假設你手機dpi是320,可是你只在xxhpdi文件夾下有對應的圖片資源文件,程序同樣能夠正常運行。因此理論上來講只須要提供一種規格的圖片資源就ok了,若是隻提供hdpi規格的圖片,對於大分辨率的手機若是把圖片放大就會不清晰,因此須要提供一套你須要支持的最大dpi的圖片,這樣即便用戶的手機分辨率很小,這樣圖片縮小依然很清晰。iphone

既然一套圖能夠達到界面的適配,那應該採起哪一套圖,又應該放在Android下面的drawable仍是mipmap下面,若是是放在drawable下面,又應該放在drawable-xxhdpi,drawable-xhdpi,drawable-xxxhdpi仍是別的密度下面呢?帶着這個疑問,接着看下面的圖:測試

Android的dpi分佈優化

Androidiosmdpi區間的手機,dp=px。在3GS上,1point=1px。xhdpi區間的手機,1dp=2px。在iPhone4上,1point=2px。在iPhone5上,1point=2px。在iPhone6上,1point=2px。xxhdpi區間的手機,1dp=3px。在iPhone6 plus上,1point=3px。google

分析:從上圖咱們能夠看出ios的2x圖片就是對應Android的xhdpi的密度,ios的3x圖片就是對應Android的xxhdpi的密度。
結論:前面咱們獲得結論是Android下面也是一套圖也是能夠適配的,意味着咱們將ios的3x圖放在xxhdpi文件夾下面,或者拿ios2x的圖片放在xhdpi下面都是能適配主流的分辨率機型。可是根據前面的分析,爲了防止放大不清楚的狀況,Android最好是放在xxhdpi下面。spa

有人可能會有疑問,放在xxhdpi密度下面的圖片,會不會內存增大,畢竟圖片會變大,那咱們再進行內存層面的分析:
經測試:
3.首頁2x的圖片放在xxhdpi下面,在xxhdpi密度的手機下顯示:width = 750 height = 1294 bitmap = 3791kb
4.首頁2x的圖片放在xhdpi下面,在xxhdpi密度的手機下顯示:width = 1125 height = 1941bitmap = 8529kb 大小是放在xxhdpi的2.25倍。設計

分析:有個 drawable的density 和真實屏幕的 targetDensity,由於 scaledWidth 和 scaledHeight 是由 width 和 height 乘以 scale (手機真實的屏幕密度/drawable的密度)獲得的。咱們看到 Canvas 放大了 scale 倍,而後又把讀到內存的這張 bitmap 畫上去,至關於把這張 bitmap 放大了 scale 平方倍。
結論:雖然上面說了xxhdpi下的圖片在加載的過程內存消耗得更少,可是前提是指同一張圖片從xxhdpi一到xhpi下面的話,加載內存通常會擴大2.25倍。可是因爲3x的圖片原本長寬原本就比2x的圖片長寬的像素點就是多1.5倍。因此通常在這個層面,若是咱們把ios的2x圖片放在xhdpi下面和把ios的3x圖片放在xxhdpi下面,對於同一個真機加載消耗的內存基本是同樣的。code

5.另外不少人對圖片是放在mipmap下面仍是drawable下面老是有疑問,對放在什麼文件夾下面沒有什麼概念,對此官方有個解釋:
Drawables may be stripped out as part of dp-specific resource optimisation. But mipmaps will not be stripped. So it's best to put app icons under mipmaps.

Here is more detail written on google documentation page:
Different home screen launcher apps on different devices show app launcher icons at various resolutions. When app resource optimization techniques remove resources for unused screen densities, launcher icons can wind up looking fuzzy because the launcher app has to upscale a lower-resolution icon for display. To avoid these display issues, apps should use the mipmap/ resource folders for launcher icons. The Android system preserves these resources regardless of density stripping, and ensures that launcher apps can pick icons with the best resolution for display.

總結下:上面話就是想表達放在drawable的圖片會對不適用真機屏幕密度的資源進行移除,放在mipmap依然會保留下各個密度的圖片,因此爲了保證桌面圖標的顯示質量所以放在mipmap下面,其餘的圖標建議都放在drawable文件夾下面吧。

6.此文發出以後,好多人提出:mipmap 中圖片適配內存消耗會更小些?因此專門針對這個問題,反編譯了幾個google的app
我查了下聽說放在 mipmap 減小內存的緣由是由於:好比 493 的 ppi 的手機,會到 xxxhdpi 下面找圖片,而後自動按照 493 和 xxxhdpi 的手機密度比進行縮放加載,從而不用加載 xxxhdpi 的內存大小的圖片,以達到內存優化,可是這個 drawable 文件夾下面也是有這樣的機制的,除了這個內存優化,其餘沒有找到官方的解釋,另外經過反編譯 google 開發的幾個 app,都發現 google 的 app 中的 mipmap 文件夾下面基本都是放 launcher 圖標,其餘的圖標都是放在 drawable 下面的。

最終結論:那麼通過上面一系列的分析,若是大家的設計師是按照iphone6來設計界面的話,Android的屏幕適配最好就是將ios的3x圖片放在Android的drawable-xxhdpi文件夾下面。

若是我的描述有什麼不許確的地方,煩請指出,謝謝!!
相關文章
相關標籤/搜索