使用备用资源适配不同屏幕或版本
1.官方文档
如何支持不同尺寸的屏幕:
https://developer.android.com/training/multiscreen/screensizes
有哪些资源支持备用
https://developer.android.com/guide/topics/resources/providing-resources
配置规则
https://developer.android.com/guide/topics/resources/providing-resources#BestMatch
2.添加备用资源
2.1 方法
- 在
res/
中创建以<resources_name>-<config_qualifier>
形式命名的新目录,多个<qualifier>
以短划线将其分隔。如 drawable-en-rUS-land<resources_name> 是相应默认资源的目录名称(如表 1 中所定义)。 <qualifier> 是指定要使用这些资源的各个配置的限定符名称(如表 2 中所定义)。 注意:追加多个限定符时,必须按照表2中列出的顺序放置限定符。如果限定符的顺序错误,则该资源将被忽略。
- 将相应的备用资源保存在此新目录下。这些资源文件必须与默认资源文件完全同名。
2.2 表1 :资源名称可备用表
可以配置备用资源的表
资源目录名 |
里面存放的资源文件 |
animator/ |
属性动画文件 |
anim/ |
视图动画 |
color/ |
颜色状态列表资源(类似Button的selector) |
drawable/ |
位图文件 没有配置限定符的目录中的资源(默认资源)是针对基准像素密度 (mdpi) 设计的,并且会调整这些位图的大小,使其大小适合当前像素密度。 |
mipmap/ |
适用于不同启动器图标密度的可绘制对象文件。请参阅管理项目概览。 |
layout/ |
界面布局 |
menu/ |
菜单 |
raw/ |
需以原始形式保存的任意文件。 |
values/ |
包含字符串、整型数和颜色等。 |
xml/ |
可在运行时读取的任意 XML 文件。 |
font/ |
带有扩展名的字体文件(如 .ttf 、.otf 或 .ttc ),或包含 <font-family> 元素的 XML 文件。 |
注意:官方文档中并没有提assets 目录
2.3 表2 : 配置限定符简表
详细见: 官方文档 中的表 2. 配置限定符名称。
https://developer.android.com/guide/topics/resources/providing-resources
限定符类别 | 说明 | 示例 |
MCC 和 MNC |
MCC : 移动设备国家代码 MNC : SIM 卡的移动设备网络代码 (可选) |
mcc310 mcc310-mnc004 mcc208-mnc00 |
语言和区域 |
第1种写法 [ 语种码 - 语言区域码(前缀用小写字母 r) ] 具体参见: 语种码 ISO 639-1 语言区域码:ISO 3166-1-alpha-2 第二种写法(Android 7.0引入) [ 具体参见: BCP 47 语言标记 |
en fr en-rUS fr-rFR fr-rCA b+en b+en+US b+es+419 |
布局方向 |
ldrtl 是指“布局方向从右到左”(如波斯语或希伯来语) ldltr 是指“布局方向从左到右”(默认) |
ldrtl ldltr |
smallestWidth sw<N>dp |
强制约定屏幕的最小可用宽度达到 N dp时才可用。 屏幕最小宽度 = min (可用宽、可用高) ,设备的最小宽度会将屏幕凹陷和系统界面等考虑在内。 例: 320*480dp不适合sw360dp,因为320 < 360 |
sw320dp sw600dp sw720dp |
可用宽度 w<N>dp |
可用宽度达到 N dp时可用 例: 320*480dp 在竖屏时,不适合 w360dp,因为 320 < 480 在横屏时,适应因为480 > 360 |
w720dp w1024dp |
可用高度 h<N>dp |
可用高度达到 N dp时可用,道理同上。 | h720dp h1024dp |
屏幕尺寸 |
|
small normal large xlarge |
屏幕纵横比 |
|
long notlong |
圆形屏幕(api23) | round :圆形屏幕,例如圆形可穿戴式设备
|
round notround |
广色域(api26) |
{@code widecg}:显示广色域,如 Display P3 或 AdobeRGB {@code nowidecg}:显示窄色域,如 sRGB |
widecg nowidecg |
高动态范围 (HDR)(api26) |
{@code highdr}:显示高动态范围 {@code lowdr}:显示低/标准动态范围 |
highdr lowdr |
屏幕方向 |
land :设备处于横向状态(水平) |
port land |
界面模式 | car :设备正在车载手机座上显示
|
car desk television appliance watch vrheadset |
夜间模式 |
night:夜间
|
night notnight |
屏幕像素密度 (dpi) |
(仅限启动器图标,请参阅支持多种屏幕中的注释)
|
ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi anydpi nnndpi |
触摸屏类型 |
notouch:设备没有触摸屏。 finger:设备有一个专供用户通过手指直接进行交互的触摸屏 |
notouch finger |
键盘可用性 |
|
keysexposed keyshidden keyssoft |
主要的文本输入法 |
|
nokeys qwerty 12key |
导航键可用性 |
|
navexposed navhidden |
主要的非触摸导航方法 |
|
nonav dpad trackball wheel |
平台版本 | API 级别 |
|
2.4 表3 : 屏幕尺寸和dp对照表
3.多个资源匹配的方法
当您提供备用资源时,Android 会根据当前的设备配置选择要在运行时使用的备用资源。
步骤如下:
- 淘汰与设备配置冲突的资源文件。
- 选择列表(表 2)中(下一个)优先级最高的限定符。(从 MCC 开始,然后向下移动。)
- 是否有资源目录包含此限定符?
若无,请返回到第 2 步,看看下一个限定符。 若有,请继续执行第 4 步。
- 淘汰不含此限定符的资源目录。
- 返回并重复第 2 步、第 3 步和第 4 步,直到仅剩一个目录为止。
4.不同dpi时,位图设计比例
要针对不同的密度创建备用可绘制位图资源,应遵循六种主要密度之间的 3:4:6:8:12:16 缩放比。
例如,如果有一个可绘制位图资源,它在中密度屏幕上的大小为 48x48 像素,那么它在其他密度的屏幕上的大小应该为:
- 36x36 (0.75x) - 低密度 (ldpi)
- 48x48(1.0x 基准)- 中密度 (mdpi)
- 72x72 (1.5x) - 高密度 (hdpi)
- 96x96 (2.0x) - 超高密度 (xhdpi)
- 144x144 (3.0x) - 超超高密度 (xxhdpi)
- 192x192 (4.0x) - 超超超高密度 (xxxhdpi)
5.要把图标放在mipmap中
Launcher在显示的应用图标时,可能会比设备的密度级别所要求的大差不多 25%。
例如,如果设备的密度为xxhdpi,而提供的最大应用图标密度级别为 drawable-xxhdpi,没有drawable-xxx-hdpi资源
,则启动器应用会放大xxhdpi内的图标,这会导致它看起来不太清晰。
同时,有的时候可能只打针对xxhpi打包,那么apk内就没有其它dpi目录,这时就会缩放,也导致不清晰。
而把应用图标放在 mipmap系列 目录内,它们不会被删除,每个apk内必含所有dpi的,这时即使Launcher会放大,也能从更高的dpi中找到合适的图标。
设计图标时要按照上一节内容,生成对应大小的直角图标和圆角图标后再分别放到相应的mipmap目录中。
官方设计图标教程:
https://developer.android.com/studio/write/image-asset-studio