Android怎么找到最优适配资源

当我们将一些提供了不同的资源文件可供Android系统选择的时候,Android会在运行时会根据一套适配的规则选择最符合当前配置的资源。为了说明Android怎么选择资源,假设我们有以下可选的资源文件目录,每一个目录都包含同一张图片的不同版本。

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/

Android根据下面的逻辑去选择资源

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/

例外:屏幕像素密度(Screen pixel density) 这种限定词不会简单地因为跟当前系统配置不同而被排除。即使当前屏幕的配置是hdpi,drawable-port-ldpi/不会被排除,因为每种屏幕密度都被认为可适配的。更多相关的信息查看Supporting Multiple Screens.

2、选出列表中(下一个)最高优先级限定词(开始于MCC,然后越往下越低)。

3、是否还有包含这个限定词的资源目录?

●否,返回步骤2然后查找下一个限定词(在例子中,答案是否,直到语言限定词被找到)。

●是,继续第4步。

4、排除没有包含这个限定词的资源文件目录。在这个例子中,系统排除了所有没有包含语言限定词的目录:

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

例外:如果限定词是屏幕像素密度(device screen density),Android会选择最接近屏幕像素密度的一个。 总之,Android比较偏向于将原始的大图片缩放成 小的图片。 参考 Supporting Multiple Screens.

5、返回重复步骤2,3,和4知道只剩下一个目录。在这个例子中,屏幕方向是下一个用来匹配资源的限定词。所以,没有限定屏幕方向的资源文件目录就被排除了。

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

最后剩下的目录是drawable-en-port

虽然在请求每一个资源文件的时候都会执行上述的处理过程,但是系统自己会进行查找过程的优化。其中一个优化就是一旦系统的配置已经被加载,它可能会排除掉永远不会匹配的可选资源。比如,如果配置中的语言为英语(“en"),那么任何其他有语言限定词又不是英语的就会从可选的资源目录池当中排除(但是如果资源目录中没有语言限定词,那么它依然是可选的)。

当根据屏幕大小选择资源的时候,如果找不到能跟当前屏幕匹配的资源,为比当前更小的屏幕设计的资源就会被使用(比如,一个large-size屏幕将会在必要的时候使用normal-size屏幕的资源文件)。然而,如果唯一可选的资源比当前的屏幕大,系统不会使用它们并且你的程序会崩溃如果没有其他的资源能够跟系统配置匹配(比如,所有的layout资源都有xlarge的限定,但是当前的设备屏幕是normal-size的)。

注意:在准确匹配资源上,限定词的优先级(在表2)比限定词的数量更重要。例如,在上面的步骤4,列表中的最后一项还包含了三种能够准确匹配系统配置的资源(orientation、touchscreen type和input method),然而drawable-en那项只有一项匹配(语言)。然而,语言有比其他限定词更高的优先级,所以drawable-port-notouch-12key就被排除了。

本文翻译自How Android Finds the Best-matching Resource

时间: 2024-10-11 17:21:27

Android怎么找到最优适配资源的相关文章

Android界面性能调优手册

转载:https://androidtest.org/android-graphics-performance-pattens/#11 界面是 Android 应用中直接影响用户体验最关键的部分.如果代码实现得不好,界面容易发生卡顿且导致应用占用大量内存. 我司这类做 ROM 的公司更不一样,预装的应用一定要非常流畅,这样给客户或用户的第一感觉就是快.又卡又慢的应用体验,会影响客户或用户对产品的信心和评价,所以不可忽视. 目录 一. Android渲染知识 1.1 绘制原理 1.2 掉帧 1.3

Android 如何引用com.android.internal.R目录下的资源

Android 如何引用com.android.internal.R目录下的资源 项目需求 有一个资源跟系统上的一个资源相同,想要引用它:frameworks/base/core/res/res/drawable/ic_text_dot.xml 文件名称:ic_text_dot.xml 文件的具体内容: <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2014 The Androi

android客户端应用(native app)适配测试自动化 东海陈光剑 2014年5月5日 0:39:04

未命名 android客户端应用(native app)适配测试自动化 东海陈光剑 2014年5月5日 0:39:04 http://10.125.1.58:88/report.html?run_stamp=20140428054354&min=3&sec=214 <!doctype html><html><head>    <meta charset="UTF-8">    <title>适配测试报告<

清除Android工程中没用到的资源

项目需求一改再改,UI一调再调,结果就是项目中一堆已经用不到但却没有清理的垃圾资源,不说工程大小问题,对新进入项目的人或看其他模块的代码的人来说,这些没清理的资源可能也可能会带来困扰,所以最好还是清理掉这些垃圾,对于一个稍微大一点的工程来说,手工清理明显是不现实的,这就需要一个方法做这些事情. 清理资源文件 要清理没用的资源,首要的工作当然是找到他们,我们知道Anroid SDK中有一个工具叫lint,可以帮助我们查看工程中存在的问题,其中有一项功能就是查找没用到的资源,这样这一步就简单了,直接

Android开发者必知的开发资源

developer.android.com 官方开发者站点推荐资源 在动手编写第一个 Android 应用之前,用心读一读 Android Design 章节.尤其是下面的这些文章: Devices and Displays  (设备和显示) Touch Feedback(触摸反馈) Metrics and Grids (度量和网格) Iconography (图像研究) 同时也请下载 Downloads 部分的代码,这些代码囊括了 Android 图标和控件的设计模板,源文件,样式以及无样式图

sql server 性能调优之 资源等待PAGEIOLATCH

原文:sql server 性能调优之 资源等待PAGEIOLATCH 一.概念 在介绍资源等待PAGEIOLATCH之前,先来了解下从实例级别来分析的各种资源等待的dmv视图sys.dm_os_wait_stats.它是返回执行的线程所遇到的所有等待的相关信息,该视图是从一个实际级别来分析的各种等待,它包括200多种类型的等待,需要关注的包括PageIoLatch(磁盘I/O读写的等待时间),LCK_xx(锁的等待时间),WriteLog(日志写入等待),PageLatch(页上闩锁)Cxpa

Android 根据城市获取经纬度 适配Android 7.0 、Android 8.0

今天在开发的过程中遇到了一个很奇葩的问题,就是之前已经写好的代码在Android 7.0 的系统中运行是正常的,但是在Android8.0 的系统中运行就出现了问题.在网上也找了很多资料,经过自己的不断折腾,终于找到了问题.废话不 多说了,直接上代码:public void getLatAndLng(String cityName) {Geocoder geocoder = new Geocoder(this,Locale.CHINA);try {List<Address> addressLi

Android开发之assets目录下资源使用总结

预前知识: Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可: 第二种是assets目录下存放的原生资源文件: 因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们.那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.ap

【Android】Android中不同手机分辨率适配问题

在项目开发的过程中,同一个布局对应不同的手机会显示出不同的效果.导致这个现象产生的原因是不同手机的分辨率不同.在android sdk提供的帮助文档中,我们可以看到各种手机的分辨率和对应的屏大小.QVGA (240x320),WQVGA400(240x400),WQVGA432 (240x432),HVGA (320x480),WVGA800 (480x800),WVGA854 (480x854). 目前android手机的分辨率大致就是帮助文档中描述的几种,我们可以用两种方式进行不同手机的适配