一直以來(lái)對(duì)于系統(tǒng)選擇資源文件的流程都模糊不清,每次定義資源的時(shí)候都戰(zhàn)戰(zhàn)兢兢,終于忍無(wú)可忍,無(wú)需再忍,決定掏出官方文檔來(lái)仔細(xì)瞧一瞧。摘要記錄,以防忘記。
資源類型
一個(gè)簡(jiǎn)單的項(xiàng)目目錄如下所示:
其中資源文件放置在res目錄下,res支持的資源目錄和類型如下:
目錄 | 資源類型 |
---|---|
animator/ | 定義屬性動(dòng)畫的XML文件 |
anim/ | 定義漸變動(dòng)畫的XML文件 |
color/ | 定義顏色狀態(tài)表的XML文件 |
drawable/ | 位圖文件(.png、.9.png、.jpg、.gif)或者可編譯為以下類型的XML文件:位圖文件、九宮格文件、狀態(tài)列表文件(State List)、形狀(Shape)、動(dòng)畫可繪制文件(Animation drawables)等等 |
mipmap/ | 不同密度的Launcher圖標(biāo)文件 |
layout/ | 布局XML文件 |
menu/ | 菜單XML文件 |
raw/ | 原始資源文件,使用資源id進(jìn)行訪問(wèn),如需要文件名進(jìn)行訪問(wèn),可放置到assets/目錄下 |
values/ | 字符串、整型和樣式等簡(jiǎn)單值的XML文件,該目錄文件夾下可以有子目錄,每個(gè)文件都以標(biāo)簽<resources>定義資源,本可以將所有的簡(jiǎn)單資源文件定義到一個(gè)XML文件中,但為了結(jié)構(gòu)的清晰,我們一般使用arrays.xml來(lái)定義資源數(shù)組,colors.xml來(lái)定義顏色值,dimens.xml定義尺寸值,strings.xml來(lái)定義字符串值,styles.xml來(lái)定義樣式 |
xml/ | 運(yùn)行時(shí)可通過(guò)Resources.getXML()讀取的XML文件 |
資源選擇
資源命名
對(duì)于一個(gè)資源文件,針對(duì)設(shè)備的不同,需要提供一整套的資源文件供程序運(yùn)行時(shí)根據(jù)設(shè)備和運(yùn)行條件(橫屏或者豎屏、移動(dòng)還是聯(lián)通)的不同來(lái)選擇合適的資源文件。
資源文件必須名稱相同地放置到合適的資源文件夾下面,而資源文件夾的命名至關(guān)重要。資源文件夾必須嚴(yán)格按照“資源類型名稱-配置1-配置2-...”的方式進(jìn)行命名,如圖2中,drawable是資源類型,hdpi是一個(gè)分辨率的配置。在drawable-hdpi和drawble文件夾中分別放置相同名稱的高分辨率和默認(rèn)配置的2個(gè)資源文件。
設(shè)備在運(yùn)行時(shí)選擇資源的標(biāo)準(zhǔn)就是按照資源文件夾的命名來(lái)匹配選擇最優(yōu)的資源文件。 設(shè)備按如下表的配置順序依次匹配來(lái)選擇最佳的資源(注意:下表的配置僅為主要配置,不是全部。):
配置 | 限定符值 | 說(shuō)明 |
---|---|---|
MCC MNC | 示例:mcc460 中國(guó) mcc460-mnc00 中國(guó)移動(dòng) | mcc移動(dòng)國(guó)家代碼,mnc 移動(dòng)網(wǎng)絡(luò)代碼,mcc460是中國(guó)任一運(yùn)營(yíng)商,mcc460-mnc00 中國(guó)移動(dòng) |
語(yǔ)言和區(qū)域 | 示例:zh_rCN,zh_rTW,zh_rHK | zh,中文語(yǔ)言縮寫,r后面跟區(qū)域碼,CN大陸,TW臺(tái)灣,HK香港,這個(gè)用戶在使用過(guò)程中是有可能改變的 |
布局方向 | ldrtl,ldltr | 布局由右向左ldrtl,由左向右ltr |
smallestWidth | sw<N>dp,示例sw320dp,sw600dp | 屏幕高度和寬度的最小尺寸,一個(gè)sw320dp的文件夾定義的資源只有在高度和寬度都大于320dp的情況下才可能被使用。 |
可用寬度 | w<N>dp,示例w720dp,w960dp | 當(dāng)可用寬度大于指定寬度時(shí),即可能被選中,寬度在橫向和縱向切換時(shí)是可變的。例如一個(gè)1024*720dp的設(shè)備在縱向時(shí)不可能匹配w960dp,而在橫向時(shí)則有可能。在匹配時(shí)選擇接近但未超出當(dāng)前屏幕寬度的值。 |
可用高度 | 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:圓形屏幕,例如圓形可穿戴設(shè)備,not round 方形屏幕,手機(jī)和電腦 |
屏幕方向 | port,land | port 縱向,land 橫向 |
UI模式 | car,desk,televesion,applicance,watch | car 車載顯示;desk 桌面手機(jī)顯示,television 電視顯示,applicance 不帶顯示屏的,watch 手腕設(shè)備 |
夜間模式 | night,notnight | night 夜間,notnight 白天,根據(jù)時(shí)間進(jìn)行顯示,可以通過(guò)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:沒(méi)有觸摸屏,finger:手指交互的觸摸屏 |
鍵盤可用性 | keysexposed,keyhidden,keyssoft | keyexposed 硬鍵盤可用。keyshidden 硬鍵盤可用,但隱藏了,同時(shí)沒(méi)有啟動(dòng)軟鍵盤。keyssoft 啟用軟鍵盤。 |
輸入法 | nokeys,qwerty,12key | nokeys:設(shè)備沒(méi)有硬按鍵,qwerty設(shè)備具有標(biāo)準(zhǔn)硬鍵盤,12ke設(shè)備具有12鍵硬鍵盤 |
API版本 | v3,v7,v11等等 | 設(shè)備的API級(jí)別,v1即設(shè)備API級(jí)別為1或者更高 |
對(duì)于資源文件夾的命名必須按照上表中的順序依次配置,切不可倒置。
- 錯(cuò)誤:drawable-hdpi-port/
- 正確:drawable-port-hdpi/
選擇資源
android系統(tǒng)按照如圖3所示進(jìn)行資源的匹配選擇。
例如app有以下資源文件夾:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
系統(tǒng)配置:
運(yùn)營(yíng)商 = mcc400-mnc00
語(yǔ)言區(qū)域 = en-rGB
屏幕方向 = port
屏幕密度 = hdpi
觸屏類型 = nottouch
開始選擇:
- 取出第一個(gè)配置:mcc400-mnc00,發(fā)現(xiàn)所有的配置中都不包含此種類型的配置,不沖突不包含,跳過(guò)該配置
- 取出第二個(gè)配置:en-rGB
- 移除與en配置沖突的 drawable-fr-rCA
- 移除那些不包含此配置的資源文件夾 drawable-port-ldpi/ drawable-port-notouch-12key/
- 取出第屏幕方向布局就只剩下資源文件夾drawable-en-port/
設(shè)備兼容性
請(qǐng)確保每種配置都有一個(gè)默認(rèn)的資源可以進(jìn)行選擇,這樣在出現(xiàn)設(shè)備沒(méi)有任何匹配文件夾的情況下可以選擇默認(rèn)的文件夾中的資源而不至于導(dǎo)致系統(tǒng)崩潰。例如,如果我們只配置2種文件夾values-en,values-zh,那么在設(shè)備語(yǔ)言為法語(yǔ)(fr)的情況下,按照先移除沖突的資源文件夾的準(zhǔn)則,這2個(gè)資源文件夾都被移除了已經(jīng)沒(méi)有其他可以選擇的資源文件了,系統(tǒng)會(huì)崩潰,所有任何資源文件夾都請(qǐng)保留一個(gè)默認(rèn)名稱的資源文件夾。
創(chuàng)建別名資源
有時(shí)候有些資源希望在不同的配置下可以服用,例如一個(gè)很大的背景圖片希望在語(yǔ)言為中文(zh)和英文(en)的情況下都使用,這時(shí)候如果在drawable-zh和drawable-en的文件夾下面都放置一種圖片當(dāng)然是可以的,只是這樣會(huì)造成apk的體積過(guò)大。這時(shí)候可以將此圖拷貝到drawable/文件夾下命名為icon_zh_en,而在
drawable-en和drawable-zh文件夾下分別保存下面的icon.xml文件,那么同樣載en和zh的配置下也可以通過(guò)引用R.drawable.icon引用到圖片,從而對(duì)apk瘦身。同樣對(duì)于資源文件、數(shù)組、布局文件都可以使用別名來(lái)引用以達(dá)到避免資源重復(fù)的問(wèn)題。
<!--icon.xml-->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="icon">@drawable/icon_zh_en</drawable>
</resources>