- Technical article
- 浅谈OPhone中的资源管理和使用
浅谈OPhone中的资源管理和使用
平台基础知识, 2009-05-16 11:00:53
Tags : 费建江 OPhone
在OPhone平台中,一个应用程序所要包含和引用的外部元素统称为资源(Resources)。本文介绍了OPhone平台中资源的结构布局、框架实现以及使用,帮助开发者理解OPhone中应用程序资源的概念,以及如何快速的组织和使用资源。
资源类型及结构布局
OPhone平台中有多种资源类型,例如字符串,图片等等。每种资源都有其固定的语法和格式,在应用程序的源代码目录中也有其特殊的位置。总的说来,资源以三种类型的文件存放在本地:XML文件,位图文件以及原始数据文件。下面简单介绍了每种资源的概念和目录布局,关于其语法请参考OPhone中语法相关的文档。
1. 资源类型
OPhone系统中的资源多种多样,包括表现为xml文件的color, string, dimension, animation, menus, layout等,也包括png, jpg, gif格式的图片(建议使用png格式),还包括原始数据文件,如包含一段声音的文件等等。
2. 资源目录组织
每种资源在源码目录中都有其特定的位置,它们的根目录是源码目录中的res/目录,资源打包工具(aapt)会根据其所在的子目录和文件格式对其进行编译。下面看一下res/目录的组织。
|
res/anim/ res/drawable/ res/layout/ res/values/ res/xml/ res/raw/ |
1)anim目录
该目录下存放着描述animation类型的xml文件。
2)drawable目录
该目录下存放着.png,.9.png,.jpg等图片文件。
3) layout目录
该目录下存放着屏幕UI的layout文件,格式为xml。
4)values目录
该目录下可以存放多种资源类型的xml文件,例如定义了数组的array.xml,定义了颜色的colors.xml,定义了dimension的dimnes.xml,定义了字符串的strings.xml,定义了style的styles.xml。
5)xml目录
该目录存放了用户自定义的xml文件。
6) raw目录
该目录可存放了用户的原始数据文件,如声音文件等,这些文件在编译应用程序过程中不被编译,直接加到apk文件中。
上述目录中的文件在编译应用程序的过程中会被aapt编译成特定的格式以加快访问速度,并打包成Zip文件。如下图所示,在编译过程中,aapt会为每个资源生成一个唯一的ID值,并产生一个包含这些ID信息的类R。应用程序的JAVA文件中通过R.java中定义的这些ID来访问资源。
.jpg)
图1 aapt打包示意图
3. 根据系统配置选择最佳资源
为增加应用程序UI的美观,达到最好的人机交互体验,通常需要根据当前的系统配置选择最佳的资源。这是通过创建与上述目录平行的目录并对目录名增加限定符来实现的。
|
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> |
现在想在系统是中文的时候显示“你好”而不是“Hello”,可以创建一个如下的strings.xml。
|
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">你好</string> |
然后在res目录下创建一个名为values-zh的目录,将该strings.xml文件放到这个目路中即可。最终的res目录结构如下所示。
|
res/ values-en/ strings.xml values-zh/ |
下表是限定符的类型和有效的值。
|
限定符
|
有效值
|
|
语言
|
语言码,遵循ISO 639-1标准,小写,如en, zh.
|
|
地区
|
遵循ISO 3166-1-alpha-2标准,大写,前面加小写的“r”,例如:rUS,rCN
|
|
屏幕朝向
|
port, land, square
|
|
屏幕像素密度
|
92dpi, 108dpi等
|
|
触摸屏类型
|
notouch, stylus, finger
|
|
键盘是否可用
|
keysexposed, keyshidden
|
|
首选的输入法
|
nokeys, qwerty, 12key
|
|
首选非触摸导航方法
|
nonav, dpad, trackball, wheel
|
|
屏幕尺寸
|
320x240, 640x480等,大尺寸必须在前
|
表1 资源目录限定词
- 限定符以“-”隔开。
- 限定符是大小写敏感的。
- 同一类限定符只能有一个值。
- 限定符可以有多个,但是必须按照上表中的顺序。
- res/目录下的子目录不能嵌套。
|
res/drawable/myimage.png res/drawable-en/myimage.png res/drawable-port/myimage.png |
首先,删除不符合当前配置的资源。在例子中,由于屏幕像素密度是108dpi,所以剔除res/drawable-port-92dpi/myimage.png。
其次,选择跟当前配置匹配数目最多的。在本例中,res/drawable-en/myimage.png 和res/drawable-port/myimage.png各匹配一个,而res/drawable/myimage.png一个没有,所以被剔除。
最后,根据表1中的优先级,挑出最佳的资源。在本例中,本地语言的优先级高于屏幕方向的优先级,故删除res/drawable-port/myimage.png,选择res/drawable-en/myimage.png。
资源管理的框架
资源管理的框架大致可以分为两层:Java层和Native层。Java层封装着访问各种资源的接口,而Native层则为Java层提供了对应的接口,提高访问资源的速度。如下图所示。
图2 资源管理的框架
如何访问资源
在理解了OPhone中资源的类型,布局和简单框架后,我们来看看如何访问不同类型的资源。
要访问某个资源,必须先知道该资源的ID。在Java程序中,应用程序自身的资源可以简单的通过R.resource_type.resource_name来引用;系统的资源必须通过android.R.resource_type.resource_name来引用。而在xml类型的资源文件中,应用程序自身的资源可以通过@resource_type/resource_name来引用;其它Package的资源必须通过@package:resource_type/resource_name来引用。例如,引用系统的资源必须通过@android:resource_type/resource_name来引用。其中,resource_type可以是如下表关键字中的一个。
|
anim
|
array
|
attr
|
bool
|
color
|
|
dimen
|
drawable
|
id
|
integer
|
layout
|
|
plurals
|
raw
|
string
|
style
|
xml
|
表2 资源类型的关键字
其次,访问某种类型的资源,必须通过其相应的语法格式来访问和使用,体现在Java中就是调用Resources等类的相应接口,体现在xml类型的资源文件中就是使用特定的属性。
然后,必须得到与应用程序相关的Resources类的实例,该实例一般通过Context.getResources()获得。
下面简单介绍了访问几种常用的资源的常用接口,更详细的资料请参考Ophone SDK中Resources等类的相关接口文档。
|
Java资源ID
|
R.color.resource_name
|
|
xml引用语法
|
@[package:]color:/resource_name
|
|
Java接口
|
Resources.getColor()
|
|
Java资源ID
|
R.string.resource_name
|
|
xml引用语法
|
@[package:]string:/resource_name
|
|
Java接口
|
Resources.getString()返回纯字符串,Resources.getText()返回带有样式的字符串
|
|
Java资源ID
|
R.drawable.resource_name
|
|
xml引用语法
|
@[package:]drawable:/resource_name
|
|
Java接口
|
Resources.drawable()
|
|
Java资源ID
|
R.anim.resource_name
|
|
xml引用语法
|
@[package:]anim:/resource_name
|
|
Java接口
|
请参考Ophone SDN中关于Animation的描述
|
结束语
OPhone平台中的资源组织和管理是一个很有趣也很有意义的话题,了解各种资源的布局、框架及其访问方法,有助于开发者快速开发自己的应用程序,开发出更友好的程序界面。本文限于篇幅仅做了简略的介绍,更详细的资料请参考其它OPhone开发文档。(作者:费建江)
(声明:本网的新闻及文章版权均属OPhone SDN网站所有,如需转载请与我们编辑团队联系。任何媒体、网站或个人未经本网书面协议授权,不得进行任何形式的转载。已经取得本网协议授权的媒体、网站,在转载使用时请注明稿件来源。)