技术二三Android知识android进阶

android res 资源匹配目录 、 drawable与

2017-09-26  本文已影响203人  chendroid

android res 资源匹配目录 、 drawable与 mipmap的区别

在res目录下,有各种各样的资源文件目录,这些目录的名字是有规则的,为了更好的适配多种设备,我们需要了解这些目录的命名规则,及各中限定符的意义,熟悉系统匹配这些资源的规则。

务必要为应用使用的每种资源类型提供默认资源,这关系到应用是否会发生crash。

android 如何查找最佳匹配资源

系统逻辑:


假设以下可绘制对象目录分别包含相同图像id的不同版本:

drawable/

drawable-en/

drawable-fr-rCA/

drawable-en-port/

drawable-en-notouch-12key/

drawable-port-ldpi/

drawable-port-notouch-12key/

而设备的配置如下:


逻辑规则如下:


  1. 淘汰所有与设备配置冲突的资源文件。

    会去遍历所有的设备限定符,把所有冲突的限定符淘汰掉, 即全部的设备配置的限定符都会在这里被便遍历,淘汰掉与之冲突的资源文件

    drawable-fr-rCA/ 目录与 en-GB 语言区域冲突,因而被淘汰。

    注: 其他的设备限定符未与当前目录冲突,故而不淘汰。

    剩余:

    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, 不然会因找不到资源而发生crash.

  2. 选择列表(表 2)中(下一个)优先级最高的限定符。(先从 MCC 开始,然后下移。)

    2,3,4步里是对同一个限定符做处理。处理完4后,经过5,若仍有多个资源目录,会再次返回2,处理下一个限定符。

  3. 是否有资源目录包括此限定符?

    • 若无,请返回到第 2 步,看看下一个限定符。(在该示例中,除非达到语言限定符,否则答案始终为“否”。)
    • 若有,请继续执行第 4 步。
  1. 淘汰不含此限定符的资源目录。在该示例中,系统会淘汰所有不含语言限定符的目录。

    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

匹配资源的优化


尽管对所请求的每个资源均执行此程序,但是系统仍会对某些方面做进一步优化。 例如,系统一旦知道设备配置,即会淘汰可能永远无法匹配的备用·资源。 比如说,如果配置语言是英语(“en”),则系统绝不会将语言限定符设置为非英语的任何资源目录包含在选中的资源池中(不过,仍会将不带语言限定符的资源目录包含在该池中)。

根据屏幕尺寸(small, large等(已被淘汰))限定符选择资源时,如果没有更好的匹配资源,则系统将使用专为小于当前屏幕的屏幕而设计的资源(例如,如有必要,大尺寸屏幕将使用标准尺寸的屏幕资源)。 但是,如果唯一可用的资源大于当前屏幕,则系统不会使用这些资源,并且如果没有其他资源与设备配置匹配,应用将会崩溃(例如,如果所有布局资源均用 xlarge 限定符标记,但设备是标准尺寸的屏幕)。


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


注:限定符的优先顺序 比与设备完全匹配的限定符数量更加重要。例如,在上面的第 4 步中,列表剩下的最后选项包括三个与设备完全匹配的限定符(方向、触摸屏类型和输入法),而 drawable-en 只有一个匹配参数(语言)。但是,语言的优先顺序高于其他两个限定符,因此 drawable-port-notouch-12key 被淘汰。

限定符命名规则:

  1. 可以为单组资源指定多个限定符,使用短划线分隔

    例如:drawable-en-rUS-land表示适用于横排美国英语设备

  2. 限定符必须遵循上面列出的优先级顺序...

    若限定符不符合优先级顺序,编译查找资源的时候会报错(invalid resource directory name

  3. 不能嵌套备用资源目录

    不能有res/drawable/drawable-en/

  4. 名字不区分大小写

    编译时编译器会把目录名称转化为小写, 以避免不区分大小写的文件系统出现问题。

  5. 对于每种限定符类型,仅支持一个值

    例如对同一个语言不可能会出现drawable-rES-rFR, 而是两个目录drawable-rES, drawable-rFR.

对常用限定符举例说明:

drawable-xxhdpi, mipmap-xxhdpi, values-fr, values-zh-rCN

drawable 与mipmap的区别

引入mipmap的原因:在apk应用于手机时,系统会去选择对应的资源目录,有时启动图标ic_launcher会不合适,但是其他的资源目录已经被过滤掉了,这样导致了在手机显示上,启动图标不正确的现象。而mipmap可以保留着一个ic_launcher,而且也仅仅需要一个分辨率的icon,自动会缩放成其他分辨率的ic_launcher

将所有启动器图标放在 res/mipmap-[density]/ 文件夹中,而非 res/drawable-[density]/ 文件夹中。无论安装应用的设备屏幕分辨率如何,Android 系统都会将资源保留在这些密度特定的文件夹中,例如 mipmap-xxxhdpi。此 行为可让启动器应用为您的应用选择要显示在主 屏幕上的最佳分辨率图标。

同时,mipmap建议只存放应用启动图标,其他的仍放在drawable下。

定位的区别

总结---重要!!!


参考链接

  1. android developer 支持多种屏幕

  2. android developer 提供资源

  3. android developer android 匹配资源规则

  4. android developer 可绘制对象资源

  5. android developer blog 关于mipmap的建议

上一篇 下一篇

猜你喜欢

热点阅读