Android是如何根据限定符,来寻找合适的资源文件的?

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

本文主要介绍了当我们使用限定符修饰我们的资源文件夹,例如drawable-en-ldpi时,Android系统是根据什么规则对这些文件夹进行筛选和选择的。

本文不是严肃翻译,想查看原文的请戳 Providing Resources

我们都知道,当我们使用限定符修饰资源文件夹,比如说drawable或者是values的时候,Android系统会根据运行时所在的设备属性和配置,来动态的选择最合适的资源文件,那么,这个过程具体是如何进行的呢?我们下面就以drawable文件夹为例,详细的介绍这个选择的过程和注意事项。

现在我们要假设这样一种情况,我们在下面这些文件夹里面都包含同一张图片的不同版本:

  • drawable/
  • drawable-en/
  • drawable-fr-rCA/
  • drawable-en-port/
  • drawable-en-notouch-12key/
  • drawable-port-ldpi/
  • drawable-port-notouch-12key/

并且假设我们的运行时设备配置如下:

  • Locale = en-GB
  • Screen orientation = port
  • Screen pixel density = hdpi
  • Touchscreen type = notouch
  • Primary text input method = 12key

通过比较设备配置和上面这些可用的限定符修饰的这些drawable文件夹,最终Android设备选择了来自drawable-en-port文件夹的的图片。

系统是根据下面的逻辑来判断为什么要选择这个文件夹里面的图片的:

翻译版本:

Created with Rapha?l 2.1.21.排除和设备配置相矛盾的限定符2.按照限定符表的优先级选择下一个限定符3.是否有资源文件夹使用了这个限定符?4.排除不包含这个限定符的文件夹(应该还有一个到第2步的回环,画不出来)yesno

  1. 首先排除和设备配置想矛盾的drawable文件夹。因为drawable-fr-rCA/这个文件夹和语言环境en-GB相矛盾,所以直接就被排除掉了。现在我们的资源文件夹情况如下:

    • drawable/
    • drawable-en/
    • drawable-fr-rCA/
    • drawable-en-port/
    • drawable-en-notouch-12key/
    • drawable-port-ldpi/
    • drawable-port-notouch-12key/

注意:屏幕的像素密度修饰符,不会因为与设备配置不一样而被排除掉,即使我们的设备现在是hdpi,但是drawable-port-ldpi/也不会因为限定符的原因被排除,因为在这个阶段,所有的屏幕密度都被考虑进行适配。更多信息请参考Support Multiple Screen

2. 按照表格中的顺序,选择下一个高优先级的修饰限定符。(从MCC开始,一直往下)

限定符的顺序如下所示,从上到下,优先级递减。因为好多很少用到,所以这是一部分,更加详细的请参考原文。

配置 限定符取值示例
MCC MNC mcc310
语言 en-rUS
布局方向 ldrtl ldltr
最小宽度限定符 sw320dp
可获得宽度 w720dp
可获得高度 h720dp
屏幕尺寸 large
屏幕方面 long notlong
屏幕方向 port land
UI模式 car appliance watch
夜晚模式 night notnight
屏幕像素密度 mdpi nodpi
触摸屏幕类型 notouch finger

3. 有没有文件夹包含这些限定符?

- 如果是NO,就返回第二步,然后看下一个限定符。(在这个例子里面,在找到语言限定符之前回答都是NO)

- 如果是YES,继续第四步。

4. 排除不包含这个限定符的资源文件夹。在这个例子里面,系统会排除所有不包含语言限定符的资源文件夹。

  • drawable/
  • drawable-en/
  • drawable-en-port/
  • drawable-en-notouch-12key/
  • drawable-port-ldpi/
  • drawable-port-notouch-12key/

警告:如果上面提到的限定符是屏幕密度,那么系统就会选择最接近设备屏幕密度的资源文件夹。通常来说,Android更倾向于缩小一个比较大的图片而不是放大一个比较小的图片。

5. 返回上去,并且重复2,3,4步,一直到只有一个文件夹剩下。在这个示例中,屏幕方向是下一个限定符,所以说,不指定屏幕方向限定符的文件夹就被排除了。

  • drawable-en/
  • drawable-en-port/
  • drawable-en-notouch-12key/

现在就剩下我们的文件夹drawable-en-port/了。

虽然在我们请求每个资源文件的时候,这个步骤都会执行,但是系统对一些方面进行了优化。一旦我们的设备配置已知,那么那些永远不可能匹配的文件夹就会被排除出去。举例来说,如果我们的语言配置是英语,那么有其他语言限定符的资源文件夹就被系统排除出去,不再进行检查,这样就可以提高我们的性能。当然,那么没有指定语言限定符的资源文件夹还是存在的。

当我们选择一个基于屏幕尺寸的限定度的时候,如果没有非常适合的资源文件夹,那么系统就会选择比当前屏幕小的资源文件夹。举例来说,如果我们没有为large屏幕配置合适的资源文件,那么系统就会选择normal屏幕大小的资源。然而,如果当前可选的资源文件夹的屏幕尺寸修饰限定符比现在的屏幕大,那么我们的系统不会使用这些资源,而是会直接崩溃。举例来说,如果我们的布局资源只有xlarge限定符,如果我们在normal-size设备运行,就会直接崩溃。

注意:前面的限定符的优先级顺序比限定符的数量更加重要。举例来说,在第四部之前,可选的资源文件夹里面drawable-port-notouch-12key可能有三个限定符符合现在的设备,而drawable-en只有一个限定符符合,但是因为语言限定符的优先级比较高,所以drawable-port-notouch-12key文件夹就直接被排除了。

时间: 2024-07-31 08:50:17

Android是如何根据限定符,来寻找合适的资源文件的?的相关文章

背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 资源 资源限定符概述 资源限定符示例 示例1.资源限定符概述Resource/Qualifiers/Summary.xaml <Page x:Class="Windows10.Resource.Qualifiers.Summary" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x=&qu

资源: 资源限定符概述, 资源限定符示例

资源限定符概述 资源限定符示例 示例1.资源限定符概述Resource/Qualifiers/Summary.xaml <Page x:Class="Windows10.Resource.Qualifiers.Summary" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/200

Android资源文件手记

Android Studio 的res/values文件夹为开发者提供了自定义资源文件的能力.参考Google的文档,记录一下. 一.将资源放入res目录下指定的子目录下.res目录下支持的资源目录如下: animator/ 用于定义属性动画的 XML 文件. anim/ 定义渐变动画的 XML 文件.(属性动画也可以保存在此目录中,但是为了区分这两种类型,属性动画首选 animator/ 目录.) color/ 用于定义颜色状态列表的 XML 文件. drawable/位图文件(.png..9

Android资源文件简介

Android资源文件简介 1. Android应用资源的作用 (1) Android项目中文件分类 在Android工程中, 文件主要分为下面几类 : 界面布局文件, Java src源文件, 资源文件; -- 界面布局文件 : 在res/layout目录下定义, 用于定义Android中界面的显示样式; -- Java源码文件 : Android程序的逻辑实现, 程序主体; -- 资源文件 : 各种XML文件, 可以定义图片等资源, 以及各种图片, 音频, 视频, 3d模型等资源; (2)

Android资源文件说明

一. Android资源文件简介 1. Android应用资源的作用 (1) Android项目中文件分类 在Android工程中, 文件主要分为下面几类 : 界面布局文件, Java src源文件, 资源文件; -- 界面布局文件 : 在res/layout目录下定义, 用于定义Android中界面的显示样式; -- Java源码文件 : Android程序的逻辑实现, 程序主体; -- 资源文件 : 各种XML文件, 可以定义图片等资源, 以及各种图片, 音频, 视频, 3d模型等资源; (

Android入门(七)碎片的生命周期与限定符

原文链接:http://www.orlion.ga/560/ 这篇文章实际已经在上篇文章中写的差不多了,但是万恶的wordpress没保存!已经不止一次出现这种情况了! 一.碎片的生命周期 1.碎片的状态和回调 1. 运行状态 当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态. 2. 暂停状态 当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶) ,与它相关联的可见碎片就会进入到暂停         状态. 3. 停止状态 当一个活动进入停止状态时,与

Android 限定符

Android中一些常见的限定符可以参考下表. 使用最小宽度限定符 在上一小节中我们使用large限定符成功解决了单页双页的判断问题,不过很快又有一个新的问题出现了,large到底是指多大呢?有的时候我们希望可以更加灵活地为不同设备加载布局,不管它们是不是被系统认定为“large”,这时就可以使用最小宽度限定符(Smallest-width Qualifier)了. 最小宽度限定符允许我们对屏幕的宽度指定一个最小指(以dp为单位),然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局

Android笔记:限定符

屏幕特征限定符描述大小 small 提供给小屏幕设备的资源 normal 提供给中等屏幕设备的资源 large 提供给大屏幕设备的资源 xlarge 提供给超大屏幕设备的资源分辨率 ldpi 提供给低分辨率设备的资源(120dpi 以下) mdpi 提供给中等分辨率设备的资源(120dpi 到160dpi) hdpi 提供给高分辨率设备的资源(160dpi 到240dpi) xhdpi 提供给超高分辨率设备的资源(240dpi 到320dpi)方向 land 提供给横屏设备的资源 port 提供

Android限定符使用【初级】

在安卓系统之中,会出现不同屏幕大小. 在使用的过程中,可能是以不同形态出现.比如,手机模式或者平板模式. 想要使得同一应用在不同的屏幕状态下显示效果如意,即让APP自适应屏幕. 只需要在res目录下创建不同的layout文件夹. 例如: 新建文件夹[  layout-large  ]并在其内新建一个名字与主布局一样的xml文件及activity_main.xml     形成  layout-large/ activity_main layout-large/ activity_main布局包含