關(guān)于Android中drawable必知的一些規(guī)則
前言
一入 Android 深似海,相信很多 Android 開發(fā)者深有體會(huì),Android 系統(tǒng)版本的碎片化,Android 硬件設(shè)備的多樣性,第三方 Rom 的不確定因素?,F(xiàn)在想開發(fā)一個(gè)合格的商業(yè)化 App 真的不容易,先不說別的,應(yīng)用的兼容性就是一項(xiàng)技術(shù)和耐心的雙重考驗(yàn),想完美適配各種情況可以說是不可能的,往往都是在人力和適配率之間尋找平衡,今天要說的 drawable 就是需要適配的一個(gè)重要角色。
配置限定符
對(duì)于不同的屏幕密度、不同的設(shè)備方向,不同的語言和區(qū)域,都會(huì)涉及到備選 drawable 資源,在運(yùn)行時(shí),Android 會(huì)檢測(cè)當(dāng)前設(shè)備配置并根據(jù)具體規(guī)則(后面會(huì)提到)為應(yīng)用加載合適的資源。下面是可以使用的配置限定符,需要說明的是這些配置限定符不僅對(duì) drawable 有效,對(duì)其他資源類型(如:layout 等)也有效:
移動(dòng)國(guó)家代碼 (MCC):mcc310, mcc310-mnc004, mcc208-mnc00
語言和區(qū)域:en, fr, en-rUS 等等
布局方向:ldrtl(從右到左)ldltr(從左到右)
smallestWidth:sw<N>dp 如:sw320dp, sw600dp, sw720dp 等等,屏幕可用高度和寬度的最小尺寸,屏幕的“最小可能尺寸”。
可用寬度:w<N>dp 如:w720dp, w1024dp 等等,指定資源應(yīng)該使用的最小可用屏幕寬度,以 dp 為單位,由 <N> 值定義。在橫向和縱向之間切換時(shí),為了匹配當(dāng)前實(shí)際寬度,此配置值也會(huì)隨之發(fā)生變化。
可用高度:h<N>dp 如:h720dp, h1024dp 等等,指定資源應(yīng)該使用的最小可用屏幕高度,以dp為單位,由 <N> 值定義。 在橫向和縱向之間切換時(shí),為了匹配當(dāng)前實(shí)際高度,此配置值也會(huì)隨之發(fā)生變化。
屏幕尺寸:small, normal, large, xlarge
屏幕縱橫比:long 寬屏,如 WQVGA、WVGA、FWVGA;notlong 非寬屏,如 QVGA、HVGA 和 VGA
屏幕方向:port 設(shè)備處于縱向(垂直),land 設(shè)備處于橫向(水平)
UI 模式:car, desk, television, appliance, watch
夜間模式:night 夜間,nontight 白天
屏幕像素密度:ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi, tvdpi
觸摸屏類型:notouch, finger
鍵盤可用性:keysexposed, keyshidden, keyssoft
主要文本輸入法:nokeys, qwerty, 12key
導(dǎo)航鍵可用性:navexposed 導(dǎo)航鍵可供用戶使用,navhidden 導(dǎo)航鍵不可用
主要非觸摸導(dǎo)航方法:nonav, dpad, trackball, wheel
平臺(tái)版本(API 級(jí)別):v3, v4, v7 等等,如 v1 對(duì)應(yīng)于 API 級(jí)別 1,v4 對(duì)應(yīng)于 API 級(jí)別 4
如果你認(rèn)真研究下每個(gè)配置限定符,你就會(huì)體會(huì)到:想完美適配各種情況可以說是不可能的,其實(shí)我們平時(shí)最常用的也是基本必須要用的就是屏幕像素密度,這里有必要詳細(xì)的說一下該參數(shù):
ldpi:低密度屏幕;約為 120dpi。
mdpi:中等密度(傳統(tǒng) HVGA)屏幕;約為 160dpi。
hdpi:高密度屏幕;約為 240dpi。
xhdpi:超高密度屏幕;約為 320dpi。API 級(jí)別 8 中新增配置
xxhdpi:超超高密度屏幕;約為 480dpi。API 級(jí)別 16 中新增配置
xxxhdpi:超超超高密度屏幕使用(僅限啟動(dòng)器圖標(biāo),請(qǐng)參閱“支持多個(gè)屏幕”中的注釋);約為 640dpi。 API 級(jí)別 18 中新增配置
nodpi:它可用于您不希望縮放以匹配設(shè)備密度的位圖資源。
tvdpi:密度介于 mdpi 和 hdpi 之間的屏幕;約為 213dpi。它并不是“主要”密度組, 主要用于電視,而大多數(shù)應(yīng)用都不需要它。對(duì)于大多數(shù)應(yīng)用而言,提供 mdpi 和 hdpi 資源便已足夠,系統(tǒng)將根據(jù)需要對(duì)其進(jìn)行縮放。API 級(jí)別 13 中引入了此限定符。
六個(gè)主要密度之間的縮放比為 3:4:6:8:12:16(忽略 tvdpi 密度)。因此,9x9 (ldpi) 位圖相當(dāng)于 12x12 (mdpi)、18x18 (hdpi)、24x24 (xhdpi) 位圖,依此類推。
限定符命名規(guī)則
可以為單組資源指定多個(gè)限定符,并使用短劃線分隔。例如,drawable-en-rUS-land 適用于橫排美國(guó)英語設(shè)備。
這些限定符必須遵循上面列出的順序,所以上面的列表是有順序的。例如:錯(cuò)誤:drawable-hdpi-port/,正確:drawable-port-hdpi/
不能嵌套備用資源目錄。例如,您不能擁有 res/drawable/drawable-en/。
值不區(qū)分大小寫。在處理之前,資源編譯器會(huì)將目錄名稱轉(zhuǎn)換為小寫,以避免不區(qū)分大小寫的文件系統(tǒng)出現(xiàn)問題。 名稱中使用的任何大寫字母只是為了便于認(rèn)讀。
對(duì)于每種限定符類型,僅支持一個(gè)值。例如,若要對(duì)西班牙語和法語使用相同的 drawable 文件,則您肯定不能擁有名為 drawable-rES-rFR/ 的目錄,而是需要兩個(gè)包含相應(yīng)文件的資源目錄。
Android 匹配最佳 drawable 規(guī)則
如果你只使用一個(gè)配置限定符,那么很好匹配,找到符合該配置的 drawable 即可,但當(dāng)你同時(shí)使用多個(gè)配置限定符,且同時(shí)存在多個(gè) drawable 目錄時(shí),匹配最佳 drawable 就沒那么簡(jiǎn)單了,這里以 Android Developer 官方的例子說明,例如:現(xiàn)在你的應(yīng)用包含如下目錄:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/
同時(shí),假設(shè)目標(biāo)設(shè)備的配置如下:
區(qū)域設(shè)置 = en-GB 屏幕方向 = port 屏幕像素密度 = hdpi 觸摸屏類型 = notouch 主要文本輸入法 = 12key
具體的匹配過程如下:
1、淘汰與設(shè)備配置沖突的資源文件:其中 drawable-fr-rCA/ 目錄與 en-GB 區(qū)域設(shè)置沖突,因而被淘汰(但有個(gè)例外,屏幕像素密度是唯一一個(gè)未因沖突而被淘汰的限定符,盡管設(shè)備的屏幕密度為 hdpi,但是 drawable-port-ldpi/ 未被淘汰,因?yàn)榇藭r(shí)每個(gè)屏幕密度均視為匹配)
2、選擇在上面限定符列表中優(yōu)先級(jí)最高的限定符,先從 MCC 開始,然后下移,看是否有資源目錄包括此限定符,若無則看下一個(gè)限定符,在該示例中,除非達(dá)到語言限定符,否則答案始終為“否”。
3、若有,則淘汰不含此限定符的資源目錄。在該示例中,系統(tǒng)會(huì)淘汰所有不含語言限定符的目錄。所以到這一步符合要求的 drawable 還剩:
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
4、選擇下一個(gè)優(yōu)先級(jí)的限定符,重復(fù)執(zhí)行步驟 2, 3, 4。直到只剩下一個(gè)目錄,該例中應(yīng)該是 port, 所以淘汰后只剩:
drawable-en-port/
有兩點(diǎn)需要說明一下:
1、屏幕像素密度是唯一一個(gè)未因沖突而被淘汰的限定符,如果涉及的限定符是屏幕像素密度,則 Android 會(huì)選擇最接近設(shè)備屏幕密度的選項(xiàng)。通常 Android 傾向于縮小大型原始圖像,而不是放大小型原始圖像。
2、如果一個(gè)符合限定符的 drawable 都沒有怎么辦?還能怎么辦,崩潰唄!
drawable 和 mipmap 的區(qū)別和聯(lián)系
現(xiàn)在通過 Android Studio 創(chuàng)建工程,默認(rèn)會(huì)創(chuàng)建一系列 mipmap 文件夾,而不是以前的 drawable 文件夾。那么 mipmap 和 drawable 到底是什么關(guān)系?mipmap 取代了 drawable 了嗎?先看一下官方說明:
drawable/
For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML files that describe Drawable shapes or Drawable objects that contain multiple states (normal, pressed, or focused). See the Drawable resource type.
mipmap/
For app launcher icons. The Android system retains the resources in this folder (and density-specific folders such as mipmap-xxxhdpi) regardless of the screen resolution of the device where your app is installed. This behavior allows launcher apps to pick the best resolution icon for your app to display on the home screen. For more information about using the mipmap folders, see Managing Launcher Icons as mipmap Resources.
這里先說結(jié)論:mipmap 文件夾下,僅僅建議放啟動(dòng)圖標(biāo) (app launcher icons),也就是應(yīng)用安裝后,會(huì)顯示在桌面的那個(gè)圖標(biāo),而其他的圖片資源等,還是按照以前方式,放在 drawable 文件夾下。
那么為什么要把 Launcher Icon 放在mipmap 文件夾下? 下面英文是官方解釋:
Different home screen launcher apps on different devices show app launcher icons at various resolutions. When app resource optimization techniques remove resources for unused screen densities, launcher icons can wind up looking fuzzy because the launcher app has to upscale a lower-resolution icon for display. To avoid these display issues, apps should use the mipmap/ resource folders for launcher icons. The Android system preserves these resources regardless of density stripping, and ensures that launcher apps can pick icons with the best resolution for display.
Make sure launcher apps show a high-resolution icon for your app by moving all densities of your launcher icons to density-specific res/mipmap/ folders (for example res/mipmap-mdpi/ and res/mipmap-xxxhdpi/). The mipmap/ folders replace the drawable/ folders for launcher icons. For xxhpdi launcher icons, be sure to add the higher resolution xxxhdpi versions of the icons to enhance the visual experience of the icons on higher resolution devices.
這里是我的理解:很多不同的 Launcher App 采用的 Launcher Icon 的大小不一致,而在應(yīng)用安裝時(shí) Android 資源優(yōu)化會(huì)把 drawable 文件夾下不需要的分辨率資源刪除掉,例如在 xhdpi 的設(shè)備上將 drawable-xxhdpi 下的資源刪掉,當(dāng)然里面的 Launcher Icon 也會(huì)被刪掉,這時(shí)如果 Launcher App 采用的 Launcher Icon 大小偏大,而高分辨 xxhdpi 下的 Icon 又被刪掉了,就只能把 xhdpi 下的小尺寸 Icon 進(jìn)行放大顯示了,這樣就會(huì)造成 Launcher Icon 顯示模糊。為了避免上面的問題,就引入了 mipmap,Android 會(huì)保證 mipmap 下的資源不會(huì)因?yàn)橘Y源優(yōu)化而被刪除,確保大尺寸的 Launcher Icon 可以找到更合適分辨率的 Icon。所以 mipmap 是為 Launcher Icon 而生的,而其它的圖片資源還是放在 drawable 文件夾下,這樣有助于Android 資源優(yōu)化刪除無用的資源,減少應(yīng)用體積。
總結(jié)
以上就是關(guān)于Android中drawable必知的一些規(guī)則的全部?jī)?nèi)容,文章內(nèi)容對(duì)于Android開發(fā)者來說很實(shí)用,希望對(duì)各位有所幫助。
- android中圖形圖像處理之drawable用法分析
- 詳解Android中Drawable方法
- Android自定義Drawable實(shí)現(xiàn)圓角效果
- Android Drawable及其相關(guān)類的使用
- Android開發(fā)基于Drawable實(shí)現(xiàn)圓角矩形的方法
- Android自定義Drawable實(shí)現(xiàn)圓形和圓角
- Android Drawable和Bitmap的轉(zhuǎn)換實(shí)例詳解
- Android中drawable使用Shape資源
- Android開發(fā)使用Drawable繪制圓角與圓形圖案功能示例
- Android自定義Drawable之在Drawable中部指定透明區(qū)域方法示例
相關(guān)文章
使用Android Studio Gradle實(shí)現(xiàn)友盟多渠道打包
這篇文章主要介紹了使用Android Studio Gradle實(shí)現(xiàn)友盟多渠道打包,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Android studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App功能
這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Android使用ViewFlipper實(shí)現(xiàn)圖片切換功能
這篇文章主要為大家詳細(xì)介紹了Android使用ViewFlipper實(shí)現(xiàn)圖片切換功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android項(xiàng)目中引入aar包的正確方法介紹
生成aar之后下一步就是如何引用本地的aar文件,下面這篇文章主要給大家介紹了關(guān)于Android項(xiàng)目中引入aar包的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08