博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解Android系统如何找到最匹配的资源文件的(译)
阅读量:7006 次
发布时间:2019-06-27

本文共 2136 字,大约阅读时间需要 7 分钟。

  hot3.png

当你需要一个资源文件时,Android系统会在运行时根据当前设备的配置信息从你提供的资源中选择一个文件。为了呈现出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

通过比较设备的配置信息和可用的资源文件,Android系统从目录drawable-en-port中选择了图片资源。

系统选择出最佳匹配资源文件的算法思路如下:

1.  首先排除那些与设备的配置信息相矛盾的资源文件。

drawable-fr-rCA/ 目录被排除掉, 因为它跟设备的信息 Locale: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/目录不会被排除,因为每一个屏幕密度在这里被认为是一个点。 更多有用的信息请参考文档: 

2.  从列表中 ()挑选(下一个)最高优先级的匹配项,进行匹配。

3.  是否没有资源文件目录包含这个限制条件?

o   如果没有, 返回第2步 ,同时看看下一个限制条件。在上面的例子中,很显然是“没有”,因此要循环到“语言”这个限制条件是才会遇到下一个限制条件。

o   如果有, 则转到第4步。

4.  排除那些没有包含限制条件的资源文件目录。在上面的例子中,系统会排除所有不包含“语言”这个限制条件的资源文件目录。

drawable/

drawable-en/

drawable-en-port/

drawable-en-notouch-12key/

drawable-port-ldpi/

drawable-port-notouch-12key/

注意例外: 如果限制条件是屏幕像素密度, Android系统会选择跟设备的屏幕密度最相近的那一个。 通常, Android 系统更倾向于缩小一个较大的源图片而不是放大一个较小的源图片。参考 

5.  返回重复执行 2, 3 和4 步,直到仅有一个资源文件目录。在上面的例子中,“屏幕方向”是下一个需要比较的限制条件.。因此,排除那些没有指定屏幕方向的资源文件目录。

drawable-en/

drawable-en-port/

drawable-en-notouch-12key/

这样剩下的目录就只有drawable-en-port这一个了。

因为获取每个需要的资源文件的时候都要执行这个过程,所以需要进一步优化系统的一些不足的地方。 其中一个是,一旦知道了设备的配置信息后,系统会首先排除那些没有匹配项的资源文件目录。 例如, 如果设备配置信息中的“语言”是“英语”(“en”),则不要将那些包含了“语言”这个限制条件但却是其他语言信息的资源文件目录添加到待匹配的资源池中。尽管这样可能会留下那些没有“语言”这个限制条件的资源目录。

对“屏幕尺寸”这个限制条件进行匹配时,如果没有一个更好的资源文件时,系统会使用那些为比当前屏幕小的屏幕设计的资源文件 (例如,如果需要,一个large-size尺寸屏幕的设备会使用normal-size尺寸屏幕的资源文件)。但是,如果可以选择的资源文件所对应的屏幕尺寸都比当前屏幕的尺寸还大,此时系统不会使用这些资源文件,同时如果没有其他更好的资源文件可选的话,你的应用将会崩溃掉。(例如,如果所有的布局资源文件都是以xlarge 为标签的,而当前的设备屏幕是normal-size尺寸的。)

注意: 列表中()限制条件的优先级比限制条件的数量更加重要,尽管这些限制条件可能会跟设备的配置信息匹配的很好。比如,在第4步的之前,带匹配的资源目录中最后的一项包括三个限制条件(屏幕方向、触屏类型、输入法)可以跟设备信息匹配,但是 drawable-en 目录仅有一个匹配项(语言)。然而,“语言”拥有比其他几个限制条件更高的优先级,所以 drawable-port-notouch-12key 被排除掉。

要了解更多关于如何在你的应用中使用资源文件,请参考。

附:算法流程图

翻译至:

转载于:https://my.oschina.net/xiangmao/blog/51736

你可能感兴趣的文章
React 更新视图过程
查看>>
第k个排列
查看>>
js数值精度
查看>>
JavaScript 中 apply 、call 的详解
查看>>
设计模式系列·王小二需求历险记(二)
查看>>
百度前端学院学习:动态数据绑定(二)
查看>>
从Python2到Python3:超百万行代码迁移实践
查看>>
关于.NET Core是否应该支持WCF Hosting的争论
查看>>
云原生应用的QA
查看>>
JDK 11版本时间表
查看>>
一线:阿里云不做SaaS,那这件事会交给谁?
查看>>
使用 JavaScript 根据用户照片和姓名生成海报
查看>>
ASP.NET Core:简洁的力量
查看>>
远程桌面网关Apache Guacamole 发布1.0.0版本\n
查看>>
重磅!尤雨溪发布Vue 3.0开发路线
查看>>
拼多多回应漏洞:比薅羊毛更快的是“资损200亿”谣言的传播速度
查看>>
SRE工程师到底是做什么的?
查看>>
硅谷AI发展简史:AI和区块链都是死路一条?
查看>>
解读微软开源MMLSpark:统一的大规模机器学习生态系统
查看>>
Reinhold就Jigsaw投票一事向JCP提交公开信
查看>>