android res 資源匹配目錄 涕俗、 drawable與 mipmap的區(qū)別
在res目錄下罗丰,有各種各樣的資源文件目錄,這些目錄的名字是有規(guī)則的再姑,為了更好的適配多種設(shè)備萌抵,我們需要了解這些目錄的命名規(guī)則,及各中限定符的意義元镀,熟悉系統(tǒng)匹配這些資源的規(guī)則绍填。
-
給資源配置限定符
配置限定符是有順序的,它的優(yōu)先順序如下(從高到低):(
res
下的全部資源)-
MCC和MNC
移動國家代碼(MCC)和移動網(wǎng)絡(luò)代碼(MNC)栖疑;
drawable-mcc310-mnc004
是指美國的 Verizon 公司; -
語言和區(qū)域
例如:
en
,fr
,fr-rFR
,fr-rCA
;drawbale-en
,drawable-fr
-
布局方向
ldrtl
:表示“布局方向從右到左”ldltr
:表示“布局方向從左到右”讨永,這是默認(rèn)的隱式值。layout
,layout-ar
(阿拉伯國家專配layout),layout-ldrtl
-
smallestWidth (新配置限定符遇革, android 3.2引入)
sw<N>dp ,屏幕的基本尺寸
-
sw320dp
適用于
320*320 ldpi
卿闹、320*480 mdpi
揭糕、480*480 hdpi
-
sw600dp
適用于
600*1024mdpi
(7英寸的平板電腦) -
sw720dp
適用于
720*1280 mdpi
(10英寸平板電腦)
layout-sw320dp
,layout-sw720dp
... -
-
可用寬度(新配置限定符, android 3.2引入):
w<N>dp, w720dp, w1024dp
layout-w720dp
可用高度(新配置限定符锻霎, android 3.2引入):h<N>dp
-
屏幕尺寸:
small
,normal
,large
,xlarge
(后被拋棄)layout
,layout-large
... 屏幕縱橫比:
long寬屏
著角、notlong 非寬屏
圓形屏幕:
round
,notround
屏幕方向:
port
垂直,land
橫向UI模式:car, desk, television, appliance, watch
夜間模式: night, notnight
-
屏幕像素密度DPI: 現(xiàn)在常用的分類限定符
mdpi
旋恼、hdpi
吏口、xhdpi
、xxhdpi
蚌铜、xxxhdpi
drawable
,drawable-xhdpi
,drawable-mdpi
-
觸摸屏類型
notouch
,finger
-
鍵盤可用性
keysexposed
: 設(shè)備具有可用的鍵盤锨侯;keysoft
: 設(shè)備啟用軟鍵盤嫩海; -
主要文本輸入法
nokeys
:設(shè)備沒有用于文本輸入的硬按鍵;qwerty
:設(shè)備具有標(biāo)準(zhǔn)硬鍵盤(無論是否對用戶可見);12key
:設(shè)備具有 12 鍵硬鍵盤(無論是否對用戶可見); -
導(dǎo)航鍵可用性
navexposed
:導(dǎo)航鍵可供用戶使用;navhidden
:導(dǎo)航鍵不可用(例如冬殃,位于密封蓋子后面); -
主要非觸摸導(dǎo)航方法
nonav:除了使用觸摸屏以外,設(shè)備沒有其他導(dǎo)航設(shè)施叁怪。
dpad:設(shè)備具有用于導(dǎo)航的方向鍵审葬。
trackball:設(shè)備具有用于導(dǎo)航的軌跡球。
wheel:設(shè)備具有用于導(dǎo)航的方向盤(不常見)
-
平臺版本(API 級別)
設(shè)備支持的 API 級別奕谭。例如涣觉,v1 對應(yīng)于 API 級別 1(帶有 Android 1.0 或更高版本系統(tǒng)的設(shè)備),v4 對應(yīng)于 API 級別 4(帶有 Android 1.6 或更高版本系統(tǒng)的設(shè)備).
-
-
屏幕密度
現(xiàn)在常用的屬性是屏幕密度:
-
六種通用的密度:
ldpi(低): ~120 dpi 3
mdpi(中):120~160dpi 正常尺寸 4
hdpi(高):160~240dpi 6
xhdpi(超高):240~320dpi 8
xxhdpi(超超高):320~480dpi 12
-
xxxhdpi(超超超高):480~640dpi 16
只針對啟動圖標(biāo)才需要提供xxxhdpi
注:最后一列為dpi之間的比例血柳,用于轉(zhuǎn)換官册。(例:如果
xhdpi
里不存在資源,可以從xxhdpi
中去同名id的資源难捌,縮放0.66(8/12)即可)
-
-
匹配資源的實現(xiàn)邏輯:
系統(tǒng)通過以下過程確保任何給定資源(id)在當(dāng)前屏幕上都能保持盡可能最佳的顯示效果:
其實是對某一個具體的資源id進(jìn)行匹配膝宁。
-
使用適當(dāng)?shù)馁Y源
根據(jù)當(dāng)前屏幕的尺寸和密度,使用應(yīng)用中提供的任何尺寸和密度特定資源根吁,尋找最佳匹配項员淫。
-
如果沒有匹配資源目錄
系統(tǒng)將使用默認(rèn)資源,并按需要向上 或向下擴(kuò)展击敌,以匹配當(dāng)前的屏幕尺寸和密度介返。
注意: “默認(rèn)”資源是指未標(biāo)記配置限定符的資源。例如沃斤,
drawable/
中的資源是默認(rèn)可繪制資源圣蝎。 系統(tǒng)假設(shè)默認(rèn)資源設(shè)計用于基線屏幕尺寸和密度,即 正常屏幕尺寸和中密度衡瓶。 因此徘公,系統(tǒng)對于高密度屏幕向上擴(kuò)展默認(rèn)密度 資源,對于低密度屏幕向下擴(kuò)展鞍陨。 -
存在資源目錄在步淹,但在目錄中沒有指定的資源从隆,不一定會使用默認(rèn)資源
系統(tǒng)在縮放時可能 改用其他密度特定資源提供更好的 效果。例如缭裆,查找低密度資源但該資源不可用時键闺, 系統(tǒng)會縮小資源的高密度版本,因為 系統(tǒng)可輕松以 0.5 為系數(shù)將高密度資源縮小至低密度資源澈驼,與以 0.75 為系數(shù) 縮小中密度資源相比辛燥,偽影更少。
如果當(dāng)前手機(jī)分辨率為drawable-xxhdpi,且沒有發(fā)現(xiàn)對應(yīng)的資源時缝其,會優(yōu)先去xxxhdpi去尋找挎塌, 接著向更高密度去尋找,沒有后内边,在向下尋找榴都,依次為:
drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。
-
務(wù)必要為應(yīng)用使用的每種資源類型提供默認(rèn)資源漠其,這關(guān)系到應(yīng)用是否會發(fā)生crash嘴高。
android 如何查找最佳匹配資源
系統(tǒng)邏輯:
假設(shè)以下可繪制對象目錄分別包含相同圖像id的不同版本:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
而設(shè)備的配置如下:
語言區(qū)域 = en-GB
屏幕方向 = port
屏幕像素密度 = hdpi
觸摸屏類型 = notouch
主要文本輸入法 = 12key
邏輯規(guī)則如下:
-
淘汰所有與設(shè)備配置沖突的資源文件。
會去遍歷所有的設(shè)備限定符和屎,把所有沖突的限定符淘汰掉, 即全部的設(shè)備配置的限定符都會在這里被便遍歷拴驮,淘汰掉與之沖突的資源文件
drawable-fr-rCA/ 目錄與 en-GB 語言區(qū)域沖突,因而被淘汰柴信。
注: 其他的設(shè)備限定符未與當(dāng)前目錄沖突套啤,故而不淘汰。
剩余:
drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
例外:屏幕像素密度是唯一一個未因沖突而被淘汰的限定符随常。 盡管設(shè)備的屏幕密度為 hdpi潜沦,但是 drawable-port-ldpi/ 未被淘汰,因為此時每個屏幕密度均視為匹配线罕。
這也表明要為除了dpi限定符之外的
資源id
提供默認(rèn)的資源放入默認(rèn)目錄里止潮,例如drawable,string下的資源id
钞楼, 不然會因找不到資源而發(fā)生crash
. -
選擇列表(表 2)中(下一個)優(yōu)先級最高的限定符喇闸。(先從 MCC 開始,然后下移询件。)
2燃乍,3,4步里是對同一個限定符做處理宛琅。處理完4后刻蟹,經(jīng)過5,若仍有多個資源目錄嘿辟,會再次返回2舆瘪,處理下一個限定符片效。
-
是否有資源目錄包括此限定符?
- 若無英古,請返回到第 2 步淀衣,看看下一個限定符。(在該示例中召调,除非達(dá)到語言限定符诀姚,否則答案始終為“否”搞坝。)
- 若有,請繼續(xù)執(zhí)行第 4 步储玫。
-
淘汰不含此限定符的資源目錄豺憔。在該示例中辨绊,系統(tǒng)會淘汰所有不含語言限定符的目錄扒秸。
drawable/ 淘汰
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/ 淘汰
drawable-port-notouch-12key/ 淘汰
例外:如果涉及的限定符是屏幕像素密度骚露,則 Android 會選擇最接近設(shè)備屏幕密度的選項。通常澳厢,Android 傾向于縮小大型原始圖像环础,而不是放大小型原始圖像囚似。
- 返回并重復(fù)第 2 步剩拢、第 3 步和第 4 步,直到只剩下一個目錄為止饶唤。在此示例中徐伐,屏幕方向是下一個判斷是否匹配的限定符。因此募狂,未指定屏幕方向的資源被淘汰:
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
剩下的目錄是 drawable-en-port
办素。
匹配資源的優(yōu)化
盡管對所請求的每個資源均執(zhí)行此程序,但是系統(tǒng)仍會對某些方面做進(jìn)一步優(yōu)化祸穷。 例如性穿,系統(tǒng)一旦知道設(shè)備配置,即會淘汰可能永遠(yuǎn)無法匹配的備用·資源雷滚。 比如說需曾,如果配置語言是英語(“en”),則系統(tǒng)絕不會將語言限定符設(shè)置為非英語的任何資源目錄包含在選中的資源池中(不過祈远,仍會將不帶語言限定符的資源目錄包含在該池中)呆万。
根據(jù)屏幕尺寸(small, large等(已被淘汰))限定符選擇資源時,如果沒有更好的匹配資源车份,則系統(tǒng)將使用專為小于當(dāng)前屏幕的屏幕而設(shè)計的資源(例如谋减,如有必要,大尺寸屏幕將使用標(biāo)準(zhǔn)尺寸的屏幕資源)扫沼。 但是出爹,如果唯一可用的資源大于當(dāng)前屏幕庄吼,則系統(tǒng)不會使用這些資源,并且如果沒有其他資源與設(shè)備配置匹配严就,應(yīng)用將會崩潰(例如霸褒,如果所有布局資源均用 xlarge 限定符標(biāo)記,但設(shè)備是標(biāo)準(zhǔn)尺寸的屏幕)盈蛮。
所以不建議使用屏幕尺寸废菱,更多使用dpi。
注:限定符的優(yōu)先順序 比與設(shè)備完全匹配的限定符數(shù)量更加重要抖誉。例如殊轴,在上面的第 4 步中,列表剩下的最后選項包括三個與設(shè)備完全匹配的限定符(方向袒炉、觸摸屏類型和輸入法)旁理,而 drawable-en 只有一個匹配參數(shù)(語言)。但是我磁,語言的優(yōu)先順序高于其他兩個限定符孽文,因此 drawable-port-notouch-12key 被淘汰。
限定符命名規(guī)則:
-
可以為單組資源指定多個限定符夺艰,使用短劃線分隔
例如:
drawable-en-rUS-land
表示適用于橫排美國英語設(shè)備 -
限定符必須遵循上面列出的優(yōu)先級順序...
若限定符不符合優(yōu)先級順序芋哭,編譯查找資源的時候會報錯(
invalid resource directory name
) -
不能嵌套備用資源目錄
不能有
res/drawable/drawable-en/
-
名字不區(qū)分大小寫
編譯時編譯器會把目錄名稱轉(zhuǎn)化為小寫, 以避免不區(qū)分大小寫的文件系統(tǒng)出現(xiàn)問題郁副。
-
對于每種限定符類型减牺,僅支持一個值
例如對同一個語言不可能會出現(xiàn)
drawable-rES-rFR
, 而是兩個目錄drawable-rES
,drawable-rFR
.
對常用限定符舉例說明:
drawable-xxhdpi
, mipmap-xxhdpi
, values-fr
, values-zh-rCN
drawable 與mipmap的區(qū)別
引入mipmap的原因:在apk應(yīng)用于手機(jī)時,系統(tǒng)會去選擇對應(yīng)的資源目錄存谎,有時啟動圖標(biāo)ic_launcher
會不合適拔疚,但是其他的資源目錄已經(jīng)被過濾掉了,這樣導(dǎo)致了在手機(jī)顯示上既荚,啟動圖標(biāo)不正確的現(xiàn)象稚失。而mipmap
可以保留著一個ic_launcher
,而且也僅僅需要一個分辨率的icon恰聘,自動會縮放成其他分辨率的ic_launcher
將所有啟動器圖標(biāo)放在 res/mipmap-[density]/
文件夾中句各,而非 res/drawable-[density]/
文件夾中。無論安裝應(yīng)用的設(shè)備屏幕分辨率如何憨琳,Android 系統(tǒng)都會將資源保留在這些密度特定的文件夾中诫钓,例如 mipmap-xxxhdpi
。此 行為可讓啟動器應(yīng)用為您的應(yīng)用選擇要顯示在主 屏幕上的最佳分辨率圖標(biāo)篙螟。
同時菌湃,
mipmap
建議只存放應(yīng)用啟動圖標(biāo),其他的仍放在drawable下遍略。
定位的區(qū)別
-
drawbale
For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML files .
資源類型:位圖文件(
.png
,.9.png
,jpg
,.gif
)或編譯為以下可繪制對象資源子類型的XML文件- 位圖文件
- 九宮格(可調(diào)整大小的位圖)惧所,點9圖
- 狀態(tài)列表
- 形狀
- 動畫可繪制對象
- 其他科繪制對象
-
mipmap
For app launcher icons.
適用于不同啟動器圖標(biāo)密度的可繪制對象文件骤坐。
icon放置在mipmap文件夾還可以讓程序的launcher圖標(biāo)自動擁有跨設(shè)備密度展示的能力,例如下愈,一臺屏幕密度是xxhdpi的設(shè)備可以自動加載mipmap-xxxhdpi下的icon來作為應(yīng)用程序的launcher圖標(biāo)纽绍,這樣圖標(biāo)看上去就會更加細(xì)膩。
總結(jié)---重要J扑啤0柘摹!
要使應(yīng)用支持多種設(shè)備配置履因,務(wù)必要為使用的每種資源類型提供默認(rèn)資源障簿,這一點十分十分的重要。
把多個分辨率的
ic_launcher
-啟動圖標(biāo)放入mipmap
下栅迄,把其他的圖片資源放進(jìn)drawable-xxhdpi
站故。
- 給資源目錄命名時要多注意,是否符合規(guī)則毅舆, 是否會因為缺少默認(rèn)資源而導(dǎo)致程序在某些情況下發(fā)生
crash
西篓。
參考鏈接
android developer 支持多種屏幕
android developer 提供資源
android developer android 匹配資源規(guī)則
android developer 可繪制對象資源
android developer blog 關(guān)于mipmap的建議