Android是怎样匹配资源的

在运行时,系统通过以下程序确保任何给定资源在当前屏幕上都能保持尽可能最佳的显示效果:点击打开链接

  1. 系统使用适当的备用资源

    根据当前屏幕的尺寸和密度,系统将使用您的应用中提供的任何尺寸和密度特定资源。例如,如果设备有高密度屏幕,并且应用请求可绘制对象资源,系统将查找与设备配置最匹配的可绘制对象资源目录。根据可用的其他备用资源,包含hdpi 限定符(例如drawable-hdpi/)的资源目录可能是最佳匹配项,因此系统将使用此目录中的可绘制对象资源。

  2. 如果没有匹配的资源,系统将使用默认资源,并按需要向上或向下扩展,以匹配当前的屏幕尺寸和密度。

    “默认”资源是指未标记配置限定符的资源。例如,drawable/ 中的资源是默认可绘制资源。系统假设默认资源设计用于基线屏幕尺寸和密度,即正常屏幕尺寸和中密度。因此,系统对于高密度屏幕向上扩展默认密度资源,对于低密度屏幕向下扩展。

    当系统查找密度特定的资源但在密度特定目录中未找到时,不一定会使用默认资源。系统在缩放时可能改用其他密度特定资源提供更好的效果。例如,查找低密度资源但该资源不可用时,系统会缩小资源的高密度版本,因为系统可轻松以 0.5 为系数将高密度资源缩小至低密度资源,与以 0.75 为系数缩小中密度资源相比,伪影更少。

如需有关 Android 如何通过使配置限定符与设备配置匹配来选择备用资源的更多信息,请参阅Android 如何查找最佳匹配资源

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

============

如果不熟悉配置限定符以及系统如何使用它们来应用备用资源,请参阅提供备用资源了解详细信息。

===========

mipmap与drawable-?dpi区别

:将您的所有启动器图标放在res/mipmap-[density]/ 文件夹中,而非 res/drawable-[density]/文件夹中。无论安装应用的设备屏幕分辨率如何,Android 系统都会将资源保留在这些密度特定的文件夹中,例如mipmap-xxxhdpi。此行为可让启动器应用为您的应用选择要显示在主屏幕上的最佳分辨率图标。如需了解有关使用 mipmap文件夹的详细信息,请参阅管理项目概览

===========

----android如何查找最佳匹配资源?

                  Android会根据当前的设备配置选择要在运行时使用的备用资源。


-------Android是怎么匹配图片资源的?        

   ----------以 mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi作为扩展名

              当应用在设备对应dpi目录下没有找到某个资源时,遵循“先高再低”原则,然后按比例缩放图片:

                          比如,当前为xhdpi设备,并且只有以下几个目录,则drawable的寻找顺序为:

                               xhdpi->xxhdpi->xxxhdpi(如果没有更高的了)->nodpi(如果有的话)->hdpi->mdpi,

                                     如果在xxhdpi中找到目标图片,则压缩2/3来使用,如果在mdpi中找到图片,则放大2倍来使用。

-----详细解读

点击打开链接


--------Android是怎么匹配布局资源的?

  ----------以1920*1080形式作为扩展名

     单向检索,只匹配比自己小的,绝不往上去匹配;屏幕分辨率以720*1280为例

        系统先检索720*1280及其附近的(720*1300等),如果匹配失败,则向下检索(480*800等),直至检索的到默认(320*480),如果向下检索得不到匹配,

            则应用挂掉,运行时异常。

                      *******以上规律对屏幕适配没有任何帮助;

----------以 mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi作为扩展名

                      当应用在设备对应dpi目录下没有找到某个资源时,遵循“先高再低”原则:

                          比如,当前为xhdpi设备,并且只有以下几个目录,则layout的寻找顺序为:

                               xhdpi->xxhdpi->xxxhdpi(如果没有更高的了)->nodpi(如果有的话)->hdpi->mdpi,

                                


--------Android是怎么匹配values资源的?


----------以 mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi作为扩展名

values目录用来放置colors.xml,dimens.xml,strings.xml等,也可以根据屏幕密度设置特定的values目录让满足设定的设备进行加载,比如values-mdpi、values-hdpi、values-xhdpi、values-xxhdpi等等,然后每个目录放置一个demins.xml,使不同分辨率的设备应用不同的尺寸设置。当应用设备在当前dpi对应目录的demins.xml中没有找到目标条目时,采用“就近匹配”原则:

  • 比如,当前为hdpi设备,并且只有以下几个目录,则values的寻找顺序为:
    hdpi->xhdpi->mdpi->values,即先向上级dpi目录查找,再向下级dpi目录查找,最后一路向下查找到values目录,如果values下都找不到,就只有找values-ldpi,当然,现在有这个目录的应用不多了。

  ----------以1920*1080形式作为扩展名

            单向检索,只匹配比自己小的,绝不往上去匹配;屏幕分辨率以720*1280为例

                系统先检索720*1280及其附近的(720*1300等),如果匹配失败,则向下检索(480*800等),

                     直至检索的到默认(320*480),如果向下检索得不到匹配,

                           则应用挂掉,运行时异常。


--------亲自试验--------

默认资源 values

添加备用资源 values-720x1280

----------分别运行在

-----1920*1080  dpi 600    匹配 values-720x1280

-----1920*1080  dpi 480    匹配 values-720x1280

-----1920*1080  dpi 240    匹配 values-720x1280

-----1920*1080  dpi 320    匹配 values-720x1280

-----1920*1080  dpi 160    匹配 values-720x1280



-----720*1280   dpi320   匹配 values-720x1280              1.77

----- 672*1280   dpi320   匹配 values-720x1280         1.90

---- 672*1279   dpi320   匹配 values-720x1280         1.90

---- 672*1200  dpi320   匹配 values-720x1280         1.78

---- 672*1100  dpi320   匹配 values                             1.637

-----640*1136   dpi 300   匹配 values                        1.775

-----640*1136   dpi 330   匹配 values                          1.775


-----800*480   dpi 480     匹配 values

-----800*480   dpi 320     匹配 values

-----800*480   dpi 240     匹配 values

-----800*480   dpi 160     匹配 values


++++++++结论

单向检索,只匹配比自己小的,绝不往上去匹配;屏幕分辨率以720*1280为例

系统先检索720*1280及其附近的(720*1300等),如果匹配失败,则向下检索(480*800等),直至检索的到默认(320*480),如果向下检索得不到匹配,

则应用挂掉,运行时异常。

*******以上规律对屏幕适配没有任何帮助;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值