首先上個最新的Android分辨率統(tǒng)計的圖:
從上圖我們通過計算可以得出格二,目前的設(shè)備前四個占據(jù)大份額(77.6%)的分辨率的手機(jī)的屏幕長寬都是按照比例縮放的劈彪。
1.Android系統(tǒng)的圖片尋找機(jī)制對放在xhdpi,xxhdpi等不同密度的圖片會根據(jù)手機(jī)的密度尋找最合適的文件夾下的圖片顶猜,然后進(jìn)行根據(jù)密度的比率進(jìn)行放大沧奴,縮小處理。
2.意味著一張背景圖如果是7201280的大小的話长窄,放在上述分辨率的手機(jī)上都是可以無變形縮放的滔吠。目前我們的設(shè)計師大多情況都是按照ios的手機(jī)來設(shè)計界面的,主流是按照iphone6(7501334)
一計算挠日,你也會發(fā)現(xiàn)疮绷,這個也是和上述主流的分辨率長寬也是對應(yīng)的比率關(guān)系。
結(jié)論:我們設(shè)計師如果按照iphone6設(shè)計屏幕的話肆资,Android是可以一套圖片就可以達(dá)到界面的適配矗愧,
只不過放在xhdpi或者xxhdpi下面,Android SDK會自動屏幕尺寸選擇對應(yīng)的資源文件進(jìn)行渲染,如SDK檢測到你手機(jī)dpi是320的話會優(yōu)先到drawable-xhdpi文件夾下找對應(yīng)的圖片資源唉韭,注意只是優(yōu)先夜涕,假設(shè)你手機(jī)dpi是320,但是你只在xxhpdi文件夾下有對應(yīng)的圖片資源文件属愤,程序一樣可以正常運行女器。所以理論上來說只需要提供一種規(guī)格的圖片資源就ok了,如果只提供hdpi規(guī)格的圖片住诸,對于大分辨率的手機(jī)如果把圖片放大就會不清晰驾胆,所以需要提供一套你需要支持的最大dpi的圖片,這樣即使用戶的手機(jī)分辨率很小贱呐,這樣圖片縮小依然很清晰丧诺。
既然一套圖可以達(dá)到界面的適配,那應(yīng)該采取哪一套圖奄薇,又應(yīng)該放在Android下面的drawable還是mipmap下面驳阎,如果是放在drawable下面,又應(yīng)該放在drawable-xxhdpi,drawable-xhdpi,drawable-xxxhdpi還是別的密度下面呢馁蒂?帶著這個疑問呵晚,接著看下面的圖:
Android的dpi分布
Androidiosmdpi區(qū)間的手機(jī),dp=px沫屡。在3GS上饵隙,1point=1px。xhdpi區(qū)間的手機(jī)沮脖,1dp=2px金矛。在iPhone4上,1point=2px。在iPhone5上艺演,1point=2px。在iPhone6上,1point=2px呵俏。xxhdpi區(qū)間的手機(jī),1dp=3px往声。在iPhone6 plus上埂奈,1point=3px。
分析:從上圖我們可以看出ios的2x圖片就是對應(yīng)Android的xhdpi的密度奈应,ios的3x圖片就是對應(yīng)Android的xxhdpi的密度澜掩。
結(jié)論:前面我們得到結(jié)論是Android下面也是一套圖也是可以適配的,意味著我們將ios的3x圖放在xxhdpi文件夾下面杖挣,或者拿ios2x的圖片放在xhdpi下面都是能適配主流的分辨率機(jī)型肩榕。但是根據(jù)前面的分析,為了防止放大不清楚的情況惩妇,Android最好是放在xxhdpi下面株汉。
有人可能會有疑問筐乳,放在xxhdpi密度下面的圖片,會不會內(nèi)存增大乔妈,畢竟圖片會變大蝙云,那我們再進(jìn)行內(nèi)存層面的分析:
經(jīng)測試:
3.首頁2x的圖片放在xxhdpi下面,在xxhdpi密度的手機(jī)下顯示:width = 750 height = 1294 bitmap = 3791kb
4.首頁2x的圖片放在xhdpi下面,在xxhdpi密度的手機(jī)下顯示:width = 1125 height = 1941bitmap = 8529kb 大小是放在xxhdpi的2.25倍路召。
分析:有個 drawable的density 和真實屏幕的 targetDensity勃刨,因為 scaledWidth 和 scaledHeight 是由 width 和 height 乘以 scale (手機(jī)真實的屏幕密度/drawable的密度)得到的。我們看到 Canvas 放大了 scale 倍股淡,然后又把讀到內(nèi)存的這張 bitmap 畫上去身隐,相當(dāng)于把這張 bitmap 放大了 scale 平方倍。
結(jié)論:雖然上面說了xxhdpi下的圖片在加載的過程內(nèi)存消耗得更少唯灵,但是前提是指同一張圖片從xxhdpi一到xhpi下面的話贾铝,加載內(nèi)存一般會擴(kuò)大2.25倍。但是由于3x的圖片本來長寬本來就比2x的圖片長寬的像素點就是多1.5倍早敬。所以一般在這個層面忌傻,如果我們把ios的2x圖片放在xhdpi下面和把ios的3x圖片放在xxhdpi下面,對于同一個真機(jī)加載消耗的內(nèi)存基本是一樣的搞监。
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.
總結(jié)下:上面話就是想表達(dá)放在drawable的圖片會對不適用真機(jī)屏幕密度的資源進(jìn)行移除琐驴,放在mipmap依然會保留下各個密度的圖片俘种,所以為了保證桌面圖標(biāo)的顯示質(zhì)量因此放在mipmap下面,其他的圖標(biāo)建議都放在drawable文件夾下面吧绝淡。
6.此文發(fā)出之后宙刘,好多人提出:mipmap 中圖片適配內(nèi)存消耗會更小些?所以專門針對這個問題牢酵,反編譯了幾個google的app
我查了下?lián)f放在 mipmap 減少內(nèi)存的原因是因為:比如 493 的 ppi 的手機(jī)悬包,會到 xxxhdpi 下面找圖片,然后自動按照 493 和 xxxhdpi 的手機(jī)密度比進(jìn)行縮放加載馍乙,從而不用加載 xxxhdpi 的內(nèi)存大小的圖片布近,以達(dá)到內(nèi)存優(yōu)化,但是這個 drawable 文件夾下面也是有這樣的機(jī)制的丝格,除了這個內(nèi)存優(yōu)化撑瞧,其他沒有找到官方的解釋,另外通過反編譯 google 開發(fā)的幾個 app显蝌,都發(fā)現(xiàn) google 的 app 中的 mipmap 文件夾下面基本都是放 launcher 圖標(biāo)预伺,其他的圖標(biāo)都是放在 drawable 下面的。
最終結(jié)論:那么經(jīng)過上面一系列的分析,如果你們的設(shè)計師是按照iphone6來設(shè)計界面的話酬诀,Android的屏幕適配最好就是將ios的3x圖片放在Android的drawable-xxhdpi文件夾下面脏嚷。
如果個人描述有什么不準(zhǔn)確的地方,煩請指出料滥,謝謝H谎邸!