Android应用资源全面分析之一:总论
Android应用资源是指除代码以外,组成Android程序的又一重要组件。它主要是为Android程序提供各种形式的配套资源和辅助支持,以供代码调用。其内容包括图片、声音、视频、字体、动画文件、数据库、文档、布局文件、菜单、颜色、数值……。
Android应用资源总体来说有两种格式:原生格式和xml格式。对于原生资源Android没有特殊格式规定,只需满足资源内容的要求即可。xml资源则必须符合Andoid的格式规定:xml格式+指定的标签,主要用来提供视图布局、菜单、字符串、数字、颜色、样式…….。这些资源主要用于视图的呈现,从而将模型和视图分离,更好地体现MVC思想。
一、资源位置
所有资源文件都需放在相应规定的文件夹下,如下图所示:
注:assetes的全路径是 ../ApplicationName/ModuleName/src/main/assets
res的全路径是 ../ApplicationName/ModuleName/src/main/res
二、资源定义
各种资源文件的格式定义一览表如下:
资源位置 | 资源名称 | 定义用xml标签 |
---|---|---|
assets | 原生资源 | N/A |
res/anim | 补间动画 | <alpha>/<scale>/<translate><rotate><set> <XXXinterplolator> |
res/animator | 属性动画 | <animator>/<objectAnimator>/<set> |
res/color | 颜色状态列表 | <selector> |
res/drawable | 图片 | <selelctor>/ <shape> <bitmap>/<nine-patch>/<color>/<ripple> <level-list>/ <layer-list> <scale>/ <rotate>/ <clip>/ <inset> <vector> <animation-list>/ <transition>/ <animated-vector> <animated-selector>/ <animated-rotate> |
res/layout | 视图布局文件 | <xxxLayout>/<merge> |
res/menu | 菜单文件 | <menu> |
res/mipmap | 图标图片 | <adaptive-icon> |
res/raw | 原生资源 | N/A |
res/transition | 转场动画 | <slide>/<fade>/<explode> <changeBounds>/<changeClipBounds>/<changeScroll> <changeTransform>/<changeImageTransform> <transitionSet>/<transitionManager> |
res/values | 值列表 | <resources> |
res/xml | 通用xml文档 | 自定义 |
res/font | 字体引用 | <font-family> |
三、资源引用
某种资源定义好后可以直接在其它xml资源定义中引用(除下表in XML列标注为N/A的资源外),也可以在Android Java代码中引用,二者效果完全相同。
资源位置 | in XML | in Java |
---|---|---|
assets | N/A | getAssets().open(“path/file.ext”) |
res/anim | N/A | AnimationUtils.loadAnimation(mContext, R.anim.xxx) |
res/animator | N/A | AnimatorInflater.loadAnimator(mContext,R.animator.xxx) |
res/color | @color/xxx | getResources().getColorStateList(R.color.xxx) |
res/drawable | @drawable/xxx | getResources().getDrawable(R.drwable.xxx) |
res/layout | @layout/xxx | setContentView(R.layout.xxx) getLayoutInflater().inflate(R.layout.xxx, null) |
res/menu | N/A | getMenuInflater().inflate(R.menu.xxx, menu); |
res/mipmap | @mipmap/xxx | N/A |
res/raw | N/A | R.raw.xxx |
res/transition | @transition/xxx | TransitionInflater.from(this).inflateTransition(R.transition.xxx) |
res/values | @TTT/xxx | getResources().getTTT(R.TTT.xxx) |
res/xml | N/A | getResources().getXml(R.xml.xxx) |
res/font | @font/xxx | getResources().getFont(R.font.xxx) |
注:1)xxx代表资源文件名
2) TTT代表资源类型,如String、Integer、Color……….
3)res/font是Android O新增的(API26)。其中的xxx是一xml格式的定义文件,它引用了本文件夹下的字体文件(.otf/.ttf)。
四、资源适配
为适配Android设备的种类、大小、分辨率、屏幕方向、语言等等各种特性,上述资源位置的资源文件夹名称可以按照下表的先后顺序附加相应限定符(以“-”连接限定符,如:values-en-port、drawable-land-hdpi),然后在该文件夹下提供相应的资源即可。
优先级 | 配置 | 限定符值 |
---|---|---|
1 | MCC | 移动国家代码,示例:mcc310、mcc310-mnc004、mcc208-mnc00等等 |
MCC=The mobile country code ,国家移动代码。后面可以有选择性地跟随MNC=mobile network code,即移动网络代码。例如,mcc310代表美国的国家移动代码(MCC),而mcc310-mnc004 代表美国的Verizon运营商;而mcc208-mnc00代表法国的Orange运营商。如果设备使用的是GSM网络,那么MCC 和 MNC的代码可以在SIM卡上找到。 | ||
2 | 语言和区域 | 语言代码定义,示例:en、fr、en-rUS、fr-rFR、fr-rCA等等 |
其中两个小写英文字母表示语言代码,具体可参照ISO 639-1标准;由小写字母“r”开头、两个大写字母紧随其后的限定符表示地区码,地区码是一个可选限定符,您可以有选择地加入,但是地区码不能脱离语言代码而独立存在,具体可参照ISO 3166-1-alpha-2 标准。当用户改变设备的系统语言时,系统加载的语言资源也应当随之改变,具体可以参照我的后续翻译,或者直接点击这个链接《Handling Runtime Changes》。 | ||
3 | 布局方向(api-17) | 应用的布局方向,ldrtl 是指“布局方向从右到左”。ldltr 是指“布局方向从左到右”,这是默认的隐式值。 |
4 | smallestWidth(api-13) | 屏幕的基本尺寸,由可用屏幕区域的最小尺寸指定。swdp示例:sw320dp、sw600dp、sw720dp等等 |
表示屏幕的最小宽度。比如某个布局资源需要加载到至少600dp宽的设备屏幕上,那么您只需要在res/layout-sw600dp/目录下添加该布局文件即可,需要注意的是,屏幕最小宽度(smallestWidth )是一个设备的固定属性,它不会随着用户所持设备的方向而改变 | ||
5 | 可用宽度 | 指定资源应该使用的最小可用屏幕宽度。wdp示例:w720dp、w1024dp等等 |
6 | 可用高度 | 指定资源应该使用的最小可用屏幕高度。hdp示例:h720dp、h1024dp等等 |
7 | 屏幕尺寸 | small(320x426 dp)、normal(320x470 dp)、large(480x640 dp)、xlarge(720x960 dp),请注意:如果您的限定符尺寸超过了屏幕的实际尺寸,程序将崩溃,如您的资源都放在了large文件夹下,而设备的屏幕只有normal大小。 |
8 | 屏幕纵横比 | long:宽屏,如 WQVGA、WVGA、FWVGA;notlong:非宽屏,如 QVGA、HVGA 和 VGA |
9 | 屏幕形状 | round:圆形屏幕,如手表等设备;notround:矩形屏幕,如手机或平板.该限定符于API23引入,通过isScreenRound()可以判断设备的屏幕形状是否为圆形。 |
10 | 屏幕方向 | port:屏幕为竖直方向;land:屏幕为水平方向 |
11 | UI 模式 | car:车载系统的UI;desk:桌面系统的UI;television:电视的UI;appliance无屏幕的设备;watch:手表设备。 |
12 | 夜间模式 | night:晚间;notnight:白天。 |
13 | 屏幕像素密度 (dpi) | ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi、nodpi、tvdpi、anydpi |
14 | 触摸屏类型 | notouch:设备无触屏;finger:设备包含触摸屏 |
15 | 键盘可用性 | keysexposed:设备具有可用的键盘;keyshidden:设备具有可用的硬键盘,但它处于隐藏状态,且设备没有启用软键盘;keyssoft:设备已经启用软键盘(无论是否可见)。 |
16 | 主要文本输入法 | nokeys:设备没有用于文本输入的硬按键;qwerty:设备具有标准硬键盘(无论是否对用户可见);12key:设备具有 12 键硬键盘(无论是否对用户可见)。 |
17 | 导航键可用性 | avexposed:导航键可供用户使用;navhidden:导航键不可用(例如,位于密封盖子后面)。` |
18 | 主要非触摸导航方法 | nonav:除了使用触摸屏以外,设备没有其他导航设施;dpad:设备具有用于导航的方向键;trackball:设备具有用于导航的轨迹球;wheel:设备具有用于导航的方向盘(不常见)。 |
19 | 平台版本(API 级别) | 设备支持的 API 级别。例如,v1 对应于 API 级别 1(带有 Android 1.0 或更高版本系统的设备),v4 对应于 API 级别 4(带有 Android 1.6 或更高版本系统的设备)。 |
资源适配原则:
1.淘汰与设备配置冲突的资源文件(屏幕像素密度是唯一一个不会因冲突而被淘汰的限定符)。
2.按照限定符的优先级顺序(从MCC开始)依次选取限定符,然后查找是否有资源目录包含此限定符,都没有的话换下一个限定符,如果有的话淘汰掉不含该限定符的资源文件夹,在剩余的资源文件夹里再匹配下一个限定符。双循环结束后通常最终会只剩一个资源目录,便是最合适的资源
3.未标记配置限定符的资源文件夹下是缺省资源,在没有更合适的资源文件夹的情况下系统会选择该文件夹中的资源。
4.屏幕像素密度如果没有完全匹配的资源文件夹,则Android会按比例缩小更高密度的资源或者放大更低密度的资源来适配。
五、资源使用Demo演示
1. 通用资源
详细介绍请参见:《Android应用资源全面分析之二:通用资源》
2. Drawable资源
详细介绍请参见:《Android应用资源全面分析之三:Drawable资源》
3. 专用动画资源
详细介绍请参见:《Android应用资源全面分析之四:专用动画资源》
4. 原生资源
详细介绍请参见:《Android应用资源全面分析之五:原生资源》
建议直接下载安装APK:Android ResourceDemo,演示效果会更好。该APK可在Android5.0以上版本正常运行。
详细视频讲解欢迎观看(1小时):《安卓开发–资源使用精讲之一: 总论》