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

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

在res目錄下,有各種各樣的資源文件目錄,這些目錄的名字是有規(guī)則的,為了更好的適配多種設備,我們需要了解這些目錄的命名規(guī)則,及各中限定符的意義,熟悉系統(tǒng)匹配這些資源的規(guī)則。

  • 給資源配置限定符

    配置限定符是有順序的,它的優(yōu)先順序如下(從高到低):(res下的全部資源)

    • MCC和MNC

      移動國家代碼(MCC)和移動網(wǎng)絡代碼(MNC);

      drawable-mcc310-mnc004 是指美國的 Verizon 公司;

    • 語言和區(qū)域

      例如:en, fr, fr-rFR, fr-rCA;

      drawbale-en, drawable-fr

    • 布局方向

      ldrtl:表示“布局方向從右到左”

      ldltr:表示“布局方向從左到右”,這是默認的隱式值。

      layout, layout-ar(阿拉伯國家專配layout), layout-ldrtl

    • smallestWidth (新配置限定符, android 3.2引入)

      sw<N>dp ,屏幕的基本尺寸

      • sw320dp

        適用于320*320 ldpi320*480 mdpi480*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)在常用的分類限定符

      mdpihdpixhdpixxhdpixxxhdpi

      drawable, drawable-xhdpi, drawable-mdpi

    • 觸摸屏類型

      notouch, finger

    • 鍵盤可用性

      keysexposed: 設備具有可用的鍵盤;

      keysoft: 設備啟用軟鍵盤;

    • 主要文本輸入法

      nokeys:設備沒有用于文本輸入的硬按鍵;

      qwerty:設備具有標準硬鍵盤(無論是否對用戶可見);

      12key:設備具有 12 鍵硬鍵盤(無論是否對用戶可見);

    • 導航鍵可用性

      navexposed:導航鍵可供用戶使用;

      navhidden:導航鍵不可用(例如,位于密封蓋子后面);

    • 主要非觸摸導航方法

      nonav:除了使用觸摸屏以外,設備沒有其他導航設施。

      dpad:設備具有用于導航的方向鍵。

      trackball:設備具有用于導航的軌跡球。

      wheel:設備具有用于導航的方向盤(不常見)

    • 平臺版本(API 級別)

      設備支持的 API 級別。例如,v1 對應于 API 級別 1(帶有 Android 1.0 或更高版本系統(tǒng)的設備),v4 對應于 API 級別 4(帶有 Android 1.6 或更高版本系統(tǒng)的設備).

  • 屏幕密度

    現(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

        只針對啟動圖標才需要提供xxxhdpi

      注:最后一列為dpi之間的比例,用于轉(zhuǎn)換。(例:如果xhdpi里不存在資源,可以從xxhdpi中去同名id的資源,縮放0.66(8/12)即可)

  • 匹配資源的實現(xiàn)邏輯:

    系統(tǒng)通過以下過程確保任何給定資源(id)在當前屏幕上都能保持盡可能最佳的顯示效果:

    其實是對某一個具體的資源id進行匹配。

    1. 使用適當?shù)馁Y源

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

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

      系統(tǒng)將使用默認資源,并按需要向上 或向下擴展,以匹配當前的屏幕尺寸和密度。

      注意: “默認”資源是指未標記配置限定符的資源。例如,drawable/ 中的資源是默認可繪制資源。 系統(tǒng)假設默認資源設計用于基線屏幕尺寸和密度,即 正常屏幕尺寸和中密度。 因此,系統(tǒng)對于高密度屏幕向上擴展默認密度 資源,對于低密度屏幕向下擴展。

    3. 存在資源目錄在,但在目錄中沒有指定的資源,不一定會使用默認資源

      系統(tǒng)在縮放時可能 改用其他密度特定資源提供更好的 效果。例如,查找低密度資源但該資源不可用時, 系統(tǒng)會縮小資源的高密度版本,因為 系統(tǒng)可輕松以 0.5 為系數(shù)將高密度資源縮小至低密度資源,與以 0.75 為系數(shù) 縮小中密度資源相比,偽影更少。

      如果當前手機分辨率為drawable-xxhdpi,且沒有發(fā)現(xiàn)對應的資源時,會優(yōu)先去xxxhdpi去尋找, 接著向更高密度去尋找,沒有后,在向下尋找,依次為:
      drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。

務必要為應用使用的每種資源類型提供默認資源,這關系到應用是否會發(fā)生crash。

android 如何查找最佳匹配資源

系統(tǒng)邏輯:


假設以下可繪制對象目錄分別包含相同圖像id的不同版本:

drawable/

drawable-en/

drawable-fr-rCA/

drawable-en-port/

drawable-en-notouch-12key/

drawable-port-ldpi/

drawable-port-notouch-12key/

而設備的配置如下:

  • 語言區(qū)域 = en-GB

  • 屏幕方向 = port

  • 屏幕像素密度 = hdpi

  • 觸摸屏類型 = notouch

  • 主要文本輸入法 = 12key


邏輯規(guī)則如下:


  1. 淘汰所有與設備配置沖突的資源文件。

    會去遍歷所有的設備限定符,把所有沖突的限定符淘汰掉, 即全部的設備配置的限定符都會在這里被便遍歷,淘汰掉與之沖突的資源文件

    drawable-fr-rCA/ 目錄與 en-GB 語言區(qū)域沖突,因而被淘汰。

    注: 其他的設備限定符未與當前目錄沖突,故而不淘汰。

    剩余:

    drawable/

    drawable-en/

    drawable-en-port/

    drawable-en-notouch-12key/

    drawable-port-ldpi/

    drawable-port-notouch-12key/

    例外:屏幕像素密度是唯一一個未因沖突而被淘汰的限定符。 盡管設備的屏幕密度為 hdpi,但是 drawable-port-ldpi/ 未被淘汰,因為此時每個屏幕密度均視為匹配。

    這也表明要為除了dpi限定符之外的資源id提供默認的資源放入默認目錄里,例如drawable,string下的資源id, 不然會因找不到資源而發(fā)生crash.

  2. 選擇列表(表 2)中(下一個)優(yōu)先級最高的限定符。(先從 MCC 開始,然后下移。)

    2,3,4步里是對同一個限定符做處理。處理完4后,經(jīng)過5,若仍有多個資源目錄,會再次返回2,處理下一個限定符。

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

    • 若無,請返回到第 2 步,看看下一個限定符。(在該示例中,除非達到語言限定符,否則答案始終為“否”。)
    • 若有,請繼續(xù)執(zhí)行第 4 步。
  1. 淘汰不含此限定符的資源目錄。在該示例中,系統(tǒng)會淘汰所有不含語言限定符的目錄。

    drawable/ 淘汰

    drawable-en/

    drawable-en-port/

    drawable-en-notouch-12key/

    drawable-port-ldpi/ 淘汰

    drawable-port-notouch-12key/ 淘汰

例外:如果涉及的限定符是屏幕像素密度,則 Android 會選擇最接近設備屏幕密度的選項。通常,Android 傾向于縮小大型原始圖像,而不是放大小型原始圖像。

  1. 返回并重復第 2 步、第 3 步和第 4 步,直到只剩下一個目錄為止。在此示例中,屏幕方向是下一個判斷是否匹配的限定符。因此,未指定屏幕方向的資源被淘汰:

drawable-en/

drawable-en-port/

drawable-en-notouch-12key/

剩下的目錄是 drawable-en-port

匹配資源的優(yōu)化


盡管對所請求的每個資源均執(zhí)行此程序,但是系統(tǒng)仍會對某些方面做進一步優(yōu)化。 例如,系統(tǒng)一旦知道設備配置,即會淘汰可能永遠無法匹配的備用·資源。 比如說,如果配置語言是英語(“en”),則系統(tǒng)絕不會將語言限定符設置為非英語的任何資源目錄包含在選中的資源池中(不過,仍會將不帶語言限定符的資源目錄包含在該池中)。

根據(jù)屏幕尺寸(small, large等(已被淘汰))限定符選擇資源時,如果沒有更好的匹配資源,則系統(tǒng)將使用專為小于當前屏幕的屏幕而設計的資源(例如,如有必要,大尺寸屏幕將使用標準尺寸的屏幕資源)。 但是,如果唯一可用的資源大于當前屏幕,則系統(tǒng)不會使用這些資源,并且如果沒有其他資源與設備配置匹配,應用將會崩潰(例如,如果所有布局資源均用 xlarge 限定符標記,但設備是標準尺寸的屏幕)。


所以不建議使用屏幕尺寸,更多使用dpi。


注:限定符的優(yōu)先順序 比與設備完全匹配的限定符數(shù)量更加重要。例如,在上面的第 4 步中,列表剩下的最后選項包括三個與設備完全匹配的限定符(方向、觸摸屏類型和輸入法),而 drawable-en 只有一個匹配參數(shù)(語言)。但是,語言的優(yōu)先順序高于其他兩個限定符,因此 drawable-port-notouch-12key 被淘汰。

限定符命名規(guī)則:

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

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

  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應用于手機時,系統(tǒng)會去選擇對應的資源目錄,有時啟動圖標ic_launcher會不合適,但是其他的資源目錄已經(jīng)被過濾掉了,這樣導致了在手機顯示上,啟動圖標不正確的現(xiàn)象。而mipmap可以保留著一個ic_launcher,而且也僅僅需要一個分辨率的icon,自動會縮放成其他分辨率的ic_launcher

將所有啟動器圖標放在 res/mipmap-[density]/ 文件夾中,而非 res/drawable-[density]/ 文件夾中。無論安裝應用的設備屏幕分辨率如何,Android 系統(tǒng)都會將資源保留在這些密度特定的文件夾中,例如 mipmap-xxxhdpi。此 行為可讓啟動器應用為您的應用選擇要顯示在主 屏幕上的最佳分辨率圖標。

同時,mipmap建議只存放應用啟動圖標,其他的仍放在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.

    適用于不同啟動器圖標密度的可繪制對象文件。

    icon放置在mipmap文件夾還可以讓程序的launcher圖標自動擁有跨設備密度展示的能力,例如,一臺屏幕密度是xxhdpi的設備可以自動加載mipmap-xxxhdpi下的icon來作為應用程序的launcher圖標,這樣圖標看上去就會更加細膩。

總結---重要!!!


  • 要使應用支持多種設備配置,務必要為使用的每種資源類型提供默認資源,這一點十分十分的重要。

  • 把多個分辨率的ic_launcher-啟動圖標放入mipmap下,把其他的圖片資源放進drawable-xxhdpi

  • 給資源目錄命名時要多注意,是否符合規(guī)則, 是否會因為缺少默認資源而導致程序在某些情況下發(fā)生crash

參考鏈接

  1. android developer 支持多種屏幕

  2. android developer 提供資源

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

  4. android developer 可繪制對象資源

  5. android developer blog 關于mipmap的建議

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

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

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