使用备用资源适配不同屏幕或版本

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 方法

  1. 在 res/ 中创建以 <resources_name>-<config_qualifier> 形式命名的新目录,多个 <qualifier> 以短划线将其分隔。如 drawable-en-rUS-land
        <resources_name> 是相应默认资源的目录名称(如表 1 中所定义)。
        <qualifier> 是指定要使用这些资源的各个配置的限定符名称(如表 2 中所定义)。
        注意:追加多个限定符时,必须按照表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引入)

  [  b + 语种码 + 其他子标记 ]

  具体参见: 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:小屏幕的最小布局尺寸约为 320x426 dp。

normal:标准屏幕的最小布局尺寸约为 320x470 dp。

large:大屏幕的最小布局尺寸约为 480x640 dp。

xlarge:超大屏幕的最小布局尺寸约为 720x960 dp。

small
normal
large
xlarge
屏幕纵横比

long:宽屏,如 WQVGA、WVGA、FWVGA

notlong:非宽屏,如 QVGA、HVGA 和 VGA

long
notlong
圆形屏幕(api23) round:圆形屏幕,例如圆形可穿戴式设备

notround:方形屏幕,例如手机或平板电脑

round
notround
广色域(api26)

{@code widecg}:显示广色域,如 Display P3 或 AdobeRGB

{@code nowidecg}:显示窄色域,如 sRGB

 widecg
nowidecg
高动态范围 (HDR)(api26)

{@code highdr}:显示高动态范围

{@code lowdr}:显示低/标准动态范围

highdr
lowdr
屏幕方向

port :设备处于纵向(垂直)

land    :设备处于横向状态(水平)

 port
land
界面模式 car:设备正在车载手机座上显示

desk:设备正在桌面手机座上显示

television:设备正在通过电视显示内容

appliance:设备正在用作没有显示屏的装置

watch:设备配有显示屏,并且可戴在手腕上

vrheadset:设备正在通过虚拟现实耳机显示内容

car
desk
television
appliance
watch
vrheadset
夜间模式

night:夜间

notnight:白天

night
notnight
屏幕像素密度 (dpi)

ldpi:低密度屏幕;约为 120dpi。

mdpi:中等密度屏幕;约为 160dpi。

hdpi:高密度屏幕;约为 240dpi。

xhdpi:超高密度屏幕;约为 320dpi。

xxhdpi:绝高密度屏幕;约为 480dpi。

xxxhdpi:极高密度屏幕使用;约为 640dpi。

  (仅限启动器图标,请参阅支持多种屏幕中的注释

nodpi:无论当前屏幕的密度是多少,系统都不会缩放以此限定符标记的资源.

tvdpi:密度介于 mdpi 和 hdpi 之间的屏幕;约为 213dpi。

anydpi:此限定符适合所有屏幕密度,其优先级高于其他限定符。适用放矢量图。

nnndpi:用于表示非标准密度,其中 nnn 是正整数屏幕密度。

ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnndpi
触摸屏类型

notouch:设备没有触摸屏。

finger:设备有一个专供用户通过手指直接进行交互的触摸屏 

notouch
finger
键盘可用性

keysexposed:有外接键盘或未禁用软键盘

keyshidden :设备具有可用的硬键盘,但其处于隐藏状态,设备启用软键盘。

keyssoft   :设备已启用软键盘(无论是否可见)

keysexposed
keyshidden
keyssoft
主要的文本输入法

nokeys:设备没有用于文本输入的硬按键。

qwerty:设备拥有标准硬键盘(无论是否对用户可见)。

12key:设备拥有 12 键硬键盘(无论是否对用户可见)。

nokeys
qwerty
12key
平台版本 API 级别

 

v3
v4
v7

 

2.4 表3  :  屏幕尺寸和dp对照表 

 

3.多个资源匹配的方法

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

 

步骤如下:

  1. 淘汰与设备配置冲突的资源文件。
  2. 选择列表(表 2)中(下一个)优先级最高的限定符。(从 MCC 开始,然后向下移动。)
  3. 是否有资源目录包含此限定符?
    若无,请返回到第 2 步,看看下一个限定符。
    若有,请继续执行第 4 步。
  4. 淘汰不含此限定符的资源目录。
  5. 返回并重复第 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

 

  

posted @ 2015-10-04 17:08  f9q  阅读(357)  评论(0编辑  收藏  举报