drawable和values的加载规则
Google搞了一大套hdpi、xhdpi之類的這些東西,簡單說來,就是為了讓我們輕松實現“與設備密度無關的視覺大小一致性”,注意這里的“視覺大小一致性”,就是說無論是在手機、低分辨率平板、高分辨率平板上,一個控件或者一個圖片在物理尺寸上都是一樣大小的。
drawable目錄:先高再第
我們經常會給應用程序切幾套圖片,放在drawable-mdpi、drawable-hdpi、drawable-xhdpi等目錄下面。當應用在設備對應dpi目錄下沒有找到某個資源時,遵循“先高再低”原則,然后按比例縮放圖片。
比如,當前為xhdpi設備,并且只有以下幾個目錄,則drawable的尋找順序為:
xhdpi(2,當前設備對應的dpi)-->xxhdpi(3,比當前高的)-->xxxhdpi(如果沒有更高的了)-->drawable-->hdpi(1.5,比當前低的)->mdpi(1.0,標準),如果在xxhdpi中找到目標圖片,則壓縮2/3來使用,如果在mdpi中找到圖片,則放大2倍來使用。
這很好理解,如果我們按規則放置兩張圖片,mdpi中為48x48,xxhdpi中為144x144,那么不管我們最后從哪個目錄拿到圖片,在xhdpi設備上顯示的像素大小都是96x96,只是一個被拉伸而來,一個被壓縮而來。由于xhdpi定義了96個像素點的物理尺寸,那么這張圖的物理尺寸實際就被定下來了。?
那么,一個結論就是,對于期望保持視覺大小一致的那部分圖片而言,如果你也能接受android為你拉伸/壓縮圖片導致一定程度的模糊或者銳化,那么這些圖片是不需要在每個drawable目錄下都制作一份的。以現在主流設備來說一般可能在drawable-xxhdpi放置一份即可,這樣可以盡量避免Android為我們放大圖片所導致的OOM。
當然,在某些情況下,我們會主觀希望打破android提供的“視覺大小一致”這種機制,此時我們就可以建立另外的drawable目錄來放置需要變化的圖片了。
values目錄:就近匹配
values目錄用來放置colors.xml,dimens.xml,strings.xml等,也可以根據屏幕密度設置特定的values目錄讓滿足設定的設備進行加載,比如values-mdpi、values-hdpi、values-xhdpi、values-xxhdpi等等,然后每個目錄放置一個demins.xml,使不同分辨率的設備應用不同的尺寸設置。當應用設備在當前dpi對應目錄的demins.xml中沒有找到目標條目時,采用“就近匹配”原則(注意,和上面drawable匹配原則是不一致的)。比如,當前為hdpi設備,并且只有以下幾個目錄,則values的尋找順序為:?hdpi->xhdpi(向上一個)->mdpi(再下一個)->values,即先向上級dpi目錄查找,再向下級dpi目錄查找,最后一路向下查找到values目錄。
那么,我們需要將mdpi目錄下的值都乘以相應的倍數來放置在其他目錄下面嗎?
答案當然是否定的,由于我們對期望屏幕密度無關的值都定義為了dp單位,無論android從哪個目錄最終找到該值,都會直接應用這個值與當前設備的密度來計算最終的尺寸。
那么,既然最后都要找到values,并且能夠保證視覺大小一致性,那何必再添加其他values分辨率目錄呢?答案是在某些情況下,我們主觀希望某些尺寸不去保持視覺一致性。例如一個Button,在手機上那么大剛好,但如果在平板設備上,它還是和在手機上看起來一樣大,那它就顯得有點小了。
也就是說,我們應該把希望在任何設備上視覺大小都一樣的尺寸都放置在values目錄下并且只放置這一份,其他需要有變化的尺寸則放置在對應目錄下即可。
更推薦采用values-xhdpi-2560x1600,我們很容易通過這里的屏幕分辨率+dpi計算得到該設備的物理尺寸,顯而易見這是一個平板設備,如此我們的改動便不至于影響同DPI的低物理尺寸設備(手機),而物理尺寸差不多的設備是可以共用一套dimens.xml的。
那么,如果當前設備為xhdpi-1184x800,當前目錄有values-xhdpi-1184x800,values-xhdpi-1184x960,values-xhdpi-1184x720,android的尋找順序則是:?xhdpi-1184x800->values-xhdpi-1184x720->values-xhdpi
只向低于自己分辨率的目錄下尋找,直到values-xhdpi,如果依然沒有找到,按照之前的順序繼續進行。?
也就是說,對于同dpi的多臺不同分辨率平板設備,如果布局足夠通用,我們可以只針對最低分辨率設計dimens即可,上面的例子中,則是values-xhdpi-1184x720。?
我們還可以將這個分辨率寫得更低,低到我們有把握:如果再出現比這個分辨率更低的設備,那么它的物理尺寸一定滿足即使采用values-xhdpi中針對手機物理尺寸設計的大小也沒有問題。
轉載于:https://www.cnblogs.com/baiqiantao/p/1e3e9430ff58c18995fe1eb91ce6e5e2.html
總結
以上是生活随笔為你收集整理的drawable和values的加载规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scala学习之爬豆瓣电影
- 下一篇: UVA12511 - Virus(DP+