android res 資源匹配目錄 、 drawable與 mipmap的區(qū)別

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吏口、xhdpixxhdpi蚌铜、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)行匹配膝宁。

    1. 使用適當(dāng)?shù)馁Y源

      根據(jù)當(dāng)前屏幕的尺寸和密度,使用應(yīng)用中提供的任何尺寸和密度特定資源根吁,尋找最佳匹配項员淫。

    2. 如果沒有匹配資源目錄

      系統(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ò)展鞍陨。

    3. 存在資源目錄在步淹,但在目錄中沒有指定的資源从隆,不一定會使用默認(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ī)則如下:


  1. 淘汰所有與設(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. 選擇列表(表 2)中(下一個)優(yōu)先級最高的限定符喇闸。(先從 MCC 開始,然后下移询件。)

    2燃乍,3,4步里是對同一個限定符做處理宛琅。處理完4后刻蟹,經(jīng)過5,若仍有多個資源目錄嘿辟,會再次返回2舆瘪,處理下一個限定符片效。

  3. 是否有資源目錄包括此限定符?

    • 若無英古,請返回到第 2 步淀衣,看看下一個限定符。(在該示例中召调,除非達(dá)到語言限定符诀姚,否則答案始終為“否”搞坝。)
    • 若有,請繼續(xù)執(zhí)行第 4 步储玫。
  1. 淘汰不含此限定符的資源目錄豺憔。在該示例中辨绊,系統(tǒng)會淘汰所有不含語言限定符的目錄扒秸。

    drawable/ 淘汰

    drawable-en/

    drawable-en-port/

    drawable-en-notouch-12key/

    drawable-port-ldpi/ 淘汰

    drawable-port-notouch-12key/ 淘汰

例外:如果涉及的限定符是屏幕像素密度骚露,則 Android 會選擇最接近設(shè)備屏幕密度的選項。通常澳厢,Android 傾向于縮小大型原始圖像环础,而不是放大小型原始圖像囚似。

  1. 返回并重復(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ī)則:

  1. 可以為單組資源指定多個限定符夺艰,使用短劃線分隔

    例如:drawable-en-rUS-land表示適用于橫排美國英語設(shè)備

  2. 限定符必須遵循上面列出的優(yōu)先級順序...

    若限定符不符合優(yōu)先級順序芋哭,編譯查找資源的時候會報錯(invalid resource directory name

  3. 不能嵌套備用資源目錄

    不能有res/drawable/drawable-en/

  4. 名字不區(qū)分大小寫

    編譯時編譯器會把目錄名稱轉(zhuǎn)化為小寫, 以避免不區(qū)分大小寫的文件系統(tǒng)出現(xiàn)問題郁副。

  5. 對于每種限定符類型减牺,僅支持一個值

    例如對同一個語言不可能會出現(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西篓。

參考鏈接

  1. android developer 支持多種屏幕

  2. android developer 提供資源

  3. android developer android 匹配資源規(guī)則

  4. android developer 可繪制對象資源

  5. android developer blog 關(guān)于mipmap的建議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市憋活,隨后出現(xiàn)的幾起案子岂津,更是在濱河造成了極大的恐慌,老刑警劉巖余掖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸爆,死亡現(xiàn)場離奇詭異,居然都是意外死亡盐欺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門仅醇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冗美,“玉大人,你說我怎么就攤上這事析二》弁荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵叶摄,是天一觀的道長属韧。 經(jīng)常有香客問我,道長蛤吓,這世上最難降的妖魔是什么宵喂? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮会傲,結(jié)果婚禮上锅棕,老公的妹妹穿的比我還像新娘拙泽。我一直安慰自己,他們只是感情好裸燎,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布顾瞻。 她就那樣靜靜地躺著,像睡著了一般德绿。 火紅的嫁衣襯著肌膚如雪荷荤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天移稳,我揣著相機(jī)與錄音梅猿,去河邊找鬼。 笑死秒裕,一個胖子當(dāng)著我的面吹牛袱蚓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播几蜻,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼喇潘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梭稚?” 一聲冷哼從身側(cè)響起颖低,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弧烤,沒想到半個月后忱屑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡暇昂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年莺戒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片急波。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡从铲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澄暮,到底是詐尸還是另有隱情名段,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布泣懊,位于F島的核電站伸辟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏馍刮。R本人自食惡果不足惜信夫,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忙迁,春花似錦脐彩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恰梢,卻和暖如春佛南,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嵌言。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工嗅回, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摧茴。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓绵载,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苛白。 傳聞我的和親對象是個殘疾皇子娃豹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 概述 對于Android中的應(yīng)用資源,例如圖像购裙、字符串懂版、布局、顏色等躏率,最好是在res文件夾中定義躯畴,而不是在代碼中定...
    CP9閱讀 2,326評論 1 2
  • https://developer.android.com/guide/topics/resources/prov...
    臨界最終散射面閱讀 2,163評論 0 1
  • 本文參考自: Google的官方權(quán)威適配文檔 郭霖:Android官方提供的支持不同屏幕大小的全部方法 Storm...
    M悇芐冋憶閱讀 12,842評論 5 56
  • 今天我給大家剖析一個鄉(xiāng)鎮(zhèn)寫作者成長為羅胖形的文人騷客的歷程蓬抄。體制外的人擠著想進(jìn)體制內(nèi),進(jìn)來才發(fā)現(xiàn)體制內(nèi)成了最大的制...
    慧眼識魚閱讀 419評論 0 5
  • 生活真的是需要記錄恩掷。不記錄倡鲸,肯定要忘。一忘黄娘,就覺得忘掉的時光白活了。所以我要再接再厲克滴,將自己的生命記錄下去逼争,以供日...
    末行閱讀 439評論 4 1