一直以來對于系統(tǒng)選擇資源文件的流程都模糊不清,每次定義資源的時候都戰(zhàn)戰(zhàn)兢兢,終于忍無可忍癞志,無需再忍,決定掏出官方文檔來仔細瞧一瞧刚梭。摘要記錄,以防忘記票唆。
資源類型
一個簡單的項目目錄如下所示:
其中資源文件放置在res目錄下,res支持的資源目錄和類型如下:
目錄 | 資源類型 |
---|---|
animator/ | 定義屬性動畫的XML文件 |
anim/ | 定義漸變動畫的XML文件 |
color/ | 定義顏色狀態(tài)表的XML文件 |
drawable/ | 位圖文件(.png屹徘、.9.png走趋、.jpg、.gif)或者可編譯為以下類型的XML文件:位圖文件噪伊、九宮格文件簿煌、狀態(tài)列表文件(State List)、形狀(Shape)鉴吹、動畫可繪制文件(Animation drawables)等等 |
mipmap/ | 不同密度的Launcher圖標文件 |
layout/ | 布局XML文件 |
menu/ | 菜單XML文件 |
raw/ | 原始資源文件姨伟,使用資源id進行訪問,如需要文件名進行訪問豆励,可放置到assets/目錄下 |
values/ | 字符串夺荒、整型和樣式等簡單值的XML文件瞒渠,該目錄文件夾下可以有子目錄,每個文件都以標簽<resources>定義資源技扼,本可以將所有的簡單資源文件定義到一個XML文件中伍玖,但為了結(jié)構(gòu)的清晰,我們一般使用arrays.xml來定義資源數(shù)組剿吻,colors.xml來定義顏色值窍箍,dimens.xml定義尺寸值,strings.xml來定義字符串值丽旅,styles.xml來定義樣式 |
xml/ | 運行時可通過Resources.getXML()讀取的XML文件 |
資源選擇
資源命名
對于一個資源文件椰棘,針對設備的不同,需要提供一整套的資源文件供程序運行時根據(jù)設備和運行條件(橫屏或者豎屏榄笙、移動還是聯(lián)通)的不同來選擇合適的資源文件邪狞。
資源文件必須名稱相同地放置到合適的資源文件夾下面,而資源文件夾的命名至關(guān)重要办斑。資源文件夾必須嚴格按照“資源類型名稱-配置1-配置2-...”的方式進行命名外恕,如圖2中,drawable是資源類型乡翅,hdpi是一個分辨率的配置鳞疲。在drawable-hdpi和drawble文件夾中分別放置相同名稱的高分辨率和默認配置的2個資源文件。
設備在運行時選擇資源的標準就是按照資源文件夾的命名來匹配選擇最優(yōu)的資源文件蠕蚜。 設備按如下表的配置順序依次匹配來選擇最佳的資源(注意:下表的配置僅為主要配置尚洽,不是全部。):
配置 | 限定符值 | 說明 |
---|---|---|
MCC MNC | 示例:mcc460 中國 mcc460-mnc00 中國移動 | mcc移動國家代碼靶累,mnc 移動網(wǎng)絡代碼,mcc460是中國任一運營商腺毫,mcc460-mnc00 中國移動 |
語言和區(qū)域 | 示例:zh_rCN,zh_rTW挣柬,zh_rHK | zh,中文語言縮寫潮酒,r后面跟區(qū)域碼,CN大陸邪蛔,TW臺灣急黎,HK香港,這個用戶在使用過程中是有可能改變的 |
布局方向 | ldrtl,ldltr | 布局由右向左ldrtl,由左向右ltr |
smallestWidth | sw<N>dp,示例sw320dp,sw600dp | 屏幕高度和寬度的最小尺寸,一個sw320dp的文件夾定義的資源只有在高度和寬度都大于320dp的情況下才可能被使用侧到。 |
可用寬度 | w<N>dp,示例w720dp,w960dp | 當可用寬度大于指定寬度時勃教,即可能被選中,寬度在橫向和縱向切換時是可變的匠抗。例如一個1024*720dp的設備在縱向時不可能匹配w960dp故源,而在橫向時則有可能。在匹配時選擇接近但未超出當前屏幕寬度的值汞贸。 |
可用高度 | h<N>dp | 跟可用寬度的匹配一樣 |
屏幕尺寸 | small,normal,large,xlarge | small指屏幕尺寸小于3英寸绳军,normal小于4.5英寸,large是4.5英寸-7英寸之間印机,xlarge是7-10英寸之間 鏈接 |
屏幕縱橫比 | long,notlong | long 寬屏 如 WQVGA,,WVGA,FWVGA(帶W的),not long 非寬屏删铃,如QVGA,HVGA,VGA |
圓形屏幕 | round,not round | round:圓形屏幕耳贬,例如圓形可穿戴設備,not round 方形屏幕猎唁,手機和電腦 |
屏幕方向 | port,land | port 縱向咒劲,land 橫向 |
UI模式 | car,desk,televesion,applicance,watch | car 車載顯示;desk 桌面手機顯示,television 電視顯示诫隅,applicance 不帶顯示屏的腐魂,watch 手腕設備 |
夜間模式 | night,notnight | night 夜間,notnight 白天逐纬,根據(jù)時間進行顯示蛔屹,可以通過UiModeManager啟用和關(guān)閉 |
屏幕密度(dpi) | ldpi,mdip,hdpi,xhdpi,xxhdpi,xxxhdpi,nodpi,tvdpi,anydpi | ldpi:120dpi,mdpi:160dpi,hdpi:240dpi,xhdpi:320dpi,xxhdpi:480dpi,xxxhdpi:640dpi,按照3:4:6:8:12:16的比例。nodpi豁生,不希望被縮放的位圖資源兔毒,anydpi 任意密度的屏幕。 |
觸摸類型 | nottouch,finger | nottouch:沒有觸摸屏甸箱,finger:手指交互的觸摸屏 |
鍵盤可用性 | keysexposed,keyhidden,keyssoft | keyexposed 硬鍵盤可用育叁。keyshidden 硬鍵盤可用,但隱藏了芍殖,同時沒有啟動軟鍵盤豪嗽。keyssoft 啟用軟鍵盤。 |
輸入法 | nokeys,qwerty,12key | nokeys:設備沒有硬按鍵豌骏,qwerty設備具有標準硬鍵盤龟梦,12ke設備具有12鍵硬鍵盤 |
API版本 | v3,v7,v11等等 | 設備的API級別,v1即設備API級別為1或者更高 |
對于資源文件夾的命名必須按照上表中的順序依次配置窃躲,切不可倒置计贰。
- 錯誤:drawable-hdpi-port/
- 正確:drawable-port-hdpi/
選擇資源
android系統(tǒng)按照如圖3所示進行資源的匹配選擇。
例如app有以下資源文件夾:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
系統(tǒng)配置:
運營商 = mcc400-mnc00
語言區(qū)域 = en-rGB
屏幕方向 = port
屏幕密度 = hdpi
觸屏類型 = nottouch
開始選擇:
- 取出第一個配置:mcc400-mnc00,發(fā)現(xiàn)所有的配置中都不包含此種類型的配置蒂窒,不沖突不包含蹦玫,跳過該配置
- 取出第二個配置:en-rGB
- 移除與en配置沖突的 drawable-fr-rCA
- 移除那些不包含此配置的資源文件夾 drawable-port-ldpi/ drawable-port-notouch-12key/
- 取出第屏幕方向布局就只剩下資源文件夾drawable-en-port/
設備兼容性
請確保每種配置都有一個默認的資源可以進行選擇,這樣在出現(xiàn)設備沒有任何匹配文件夾的情況下可以選擇默認的文件夾中的資源而不至于導致系統(tǒng)崩潰刘绣。例如,如果我們只配置2種文件夾values-en,values-zh,那么在設備語言為法語(fr)的情況下挣输,按照先移除沖突的資源文件夾的準則纬凤,這2個資源文件夾都被移除了已經(jīng)沒有其他可以選擇的資源文件了,系統(tǒng)會崩潰撩嚼,所有任何資源文件夾都請保留一個默認名稱的資源文件夾停士。
創(chuàng)建別名資源
有時候有些資源希望在不同的配置下可以服用挖帘,例如一個很大的背景圖片希望在語言為中文(zh)和英文(en)的情況下都使用,這時候如果在drawable-zh和drawable-en的文件夾下面都放置一種圖片當然是可以的恋技,只是這樣會造成apk的體積過大拇舀。這時候可以將此圖拷貝到drawable/文件夾下命名為icon_zh_en,而在
drawable-en和drawable-zh文件夾下分別保存下面的icon.xml文件,那么同樣載en和zh的配置下也可以通過引用R.drawable.icon引用到圖片蜻底,從而對apk瘦身骄崩。同樣對于資源文件、數(shù)組薄辅、布局文件都可以使用別名來引用以達到避免資源重復的問題要拂。
<!--icon.xml-->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="icon">@drawable/icon_zh_en</drawable>
</resources>