參考自(https://blog.csdn.net/myoungmeng/article/details/54090891)
Android資源文件存放:
android的drawable文件一共可以有:
drawable-ldpi(低密度) drawable-mdpi(中等密度) drawable-hdpi(高密度) drawable-xhdpi(超高密度)
drawable-xxhdpi(超超高密度) drawable-xxxhdpi(超超超高密度) drawable-nohdpi(無縮放) 當然還加上默認的drawable
----------以下是重點理解內容,一定要看懂----------
比如在一個中等分辨率的手機上,Android就會選擇drawable-mdpi文件夾下的圖片,文件夾下有這張圖就會優先被使用,在這種情況下,圖片是不會被縮放的;
但是如果沒有在drawable-mdpi的文件夾下找到相應圖片的話,Android系統會首先從更高一級的drawable-hdpi文件夾中查找,如果找到圖片資源就進行縮放處理,顯示在屏幕上;
如果drawable-hdpi文件夾下也沒有的話,就依次往drawable-xhdpi文件夾、drawable-xxhdpi文件夾、drawable-xxxhdpi文件夾、drawable-nodpi;
如果更高密度的文件夾里都沒有找到,就往更低密度的文件夾里尋找,drawable-ldpi文件夾下查找;
如果都沒找到,最終會在默認的drawable文件夾中尋找,如果默認的drawable文件夾中也沒有那就會報錯啦。(前提是把一張圖片做成很多不同的分辨率放在各個對應密度的drawable文件夾下)
舉個例子,假如當前設備的dpi是320,系統會優先去drawable-xhdpi目錄查找,如果找不到,會依次查找xxhdpi → xxxhdpi → hdpi → mdpi → ldpi。對於不存在的drawable-[density]目錄直接跳過,中間任一目錄查找到資源,則停止本次查找。
如何知道自己設備的dpi:
float xdpi = getResources().getDisplayMetrics().xdpi; float ydpi = getResources().getDisplayMetrics().ydpi;
知道設備的dpi后就知道設備首先會在哪個drawable文件夾下去尋找了:dpi范圍密度對應范圍
設備密度 | 適配資源文件密度 |
---|---|
0dpi ~ 120dpi | ldpi |
120dpi ~ 160dpi | mdpi |
160dpi ~ 240dpi | hdpi |
240dpi ~ 320dpi | xhdpi |
320dpi ~ 480dpi | xxhdpi |
480dpi ~ 640dpi | xxxhdpi |
對於每種密度下的icon應該設計成什么尺寸其實Android也是給出了最佳建議,建議尺寸如下表所示:
資源文件密度 | 建議尺寸 |
---|---|
mipmap-mdpi | 48 * 48(博主實測圖標16就夠了) |
mipmap-hdpi | 72 * 72(博主實測圖標32就夠了) |
mipmap-xhdpi | 96 * 96(博主實測圖標48就夠了) |
mipmap-xxhdpi | 144 * 144(博主實測圖標64就夠了) |
mipmap-xxxhdpi | 192 * 192(博主實測圖標72就夠了) |
總體匹配規則就是這樣:
如果圖片所在目錄dpi低於匹配目錄,那么該圖片被認為是為低密度設備需要的,現在要顯示在高密度設備上,圖片會被放大。
如果圖片所在目錄dpi高於匹配目錄,那么該圖片被認為是為高密度設備需要的,現在要顯示在低密度設備上,圖片會被縮小。
如果圖片所在目錄為drawable-nodpi,則無論設備dpi為多少,保留原圖片大小,不進行縮放。
六種通用密度
Android系統為了簡化開發者為多種屏幕設計用戶界面的方式,Android將實際屏幕尺寸和范圍作了通用規定,稱作“根據可用屏幕寬度管理屏幕尺寸的新技術”。六種通用密度為
密度 | dpi范圍 |
---|---|
ldpi(低) | ~120dpi |
mdpi(中) | ~160dpi |
hdpi(高) | ~240dpi |
xhdpi(超高) | ~320dpi |
xxhdpi(超超高) | ~480dpi |
xxxhdpi(超超超高) | ~640dpi |
通用密度是以mdpi(中)為基線配置的,此基線基於第一代Android設備(T-Mobile G1)的屏幕配置。
那么六種通用密度下的縮放倍數是多少呢?以mdpi為基線,各密度目錄下的放大倍數(即縮放因子density)如下
密度 | 放大倍數 |
---|---|
ldpi | 0.75 |
mdpi | 1.0 |
hdpi | 1.5 |
xhdpi | 2.0 |
xxhdpi | 3.0 |
xxxhdpi | 4.0 |
例如,當前設備的dpi是480(即xxhdpi),那么對於存放於mdpi目錄中的圖片會被放大三倍。對於很多設備,其dpi並不剛好是六種通用密度最大dpi,這種情況下,圖片的縮放倍數如何計算呢?
稍微思考一下,我們就可以得到通用的縮放倍數(縮放因子)計算方法:對於任意設備,各drawable-[density]目錄下的圖片放大倍數的計算公式
那么,圖片的實現顯示尺寸通過圖片尺寸乘以縮放倍數就可以得到了。