阅读更多
来源《Android/OPhone开发完全讲义》
本文主要介绍Android SDK中的资源,国际化和资源自适应技术。通过国际化和资源自适应技术,使应用程序可以根据不同的语言环境显示不同的界面,风格,也可以根据手机的特性做 出相应的调整。开发者可以根据这些内容编写更有弹性的应用,并可以大大减少编码的工作量。
1、Android中的资源
资源是Android应用程序中重要的组成部分。在应用程序中会使用到字符串、菜单、图像、声音、视频等内容,这些可以统称为资源。通过将这些资源放到apk文件中与Android应用程序一同发布。如果资源文件很大,也可以将资源作为外部文件是用。
1.1、Android如何存储资源
资源大多保存在res目录中。例如字符串、颜色等资源以键值对(key-value)保存在res/values目录中的XML文件中;菜单资源保存在 res/menu目录中。ADT在生成apk文件时,这些目录中的资源文件会被编译到apk文件中,但res/raw目录中的资源不会被编译。在程序运行 时,可以通过InputStream来读取res/raw目录中的资源。
当资源文件很大时,编译后的apk文件也会很大,可能造成系统装载资源文件缓慢,从而影响应用程序的性能。这时可以将资源文件作为外部文件单独发布。
1.2、资源的种类
目录 |
资源类型 |
描述 |
res/values |
XML |
保存字符串、颜色、尺寸、类型、主题等资源,可以是任意文件名。对于字符串,颜色尺寸等信息采用key-value形式表示,对于类型,主题等资源,采用其它形式表示。 |
res/layout |
XML |
保存布局信息。一个资源文件表示一个View或者ViewGroup的布局。 |
res/menu |
XML |
保存菜单资源。一个资源文件表示一个菜单(包括子菜单)。 |
res/anim |
XML |
保存与动画相关的信息。可以定义帧(frame)动画和补间(tween)动画。 |
res/xml |
XML |
在该目录中的文件可以是任意类型的XML文件,这些XML文件可以在运行的时候被读取。 |
res/raw |
任意类型 |
在该目录中的文件不会被编译。在该目录中可以放置任意类型的文件,例如,文档,音频,视频等。 |
res/drawable |
图像 |
该目录中的文件可以是多种格式的图像文件,例如:bmp,png,gif,jpg等。在该目录中的图像不需要分辨率非常高,aapt工具会优化这个目录中的图像文件。如果想要按字流读取该目录中的图像文件,需要将图片放到res/raw目录中。 |
assets |
任意类型 |
该目录中的资源与res/raw中的资源一样,也不会被编译。但不同的是该目录中的资源不会生成资源ID。 |
1.3、资源文件的命名
每一个资源文件或资源文件中的key-value对都会在ADT自动生成R类中找到相应的ID。其中资源文件名或key-value对中的key就是R类中的Java变量名。因此,资源文件名和key的命名首先要符合Java变量的命名规范。虽然Java变量名支持中文,但是资源文件和key不能使用中文。
除了资源文件和key本身的命名规范外,多个资源文件和key也要遵循唯一的原则。也就是说,同类资源的文件名或key不能重复。
虽然操作系统会禁止同一个目录出现两个同名文件的情况发生,但由于ADT在生成ID时不考虑资源文件的扩展名,因此,在res/drawable、res/raw等目录中不能存在文件名相同、扩展名不同的资源文件。
2、定义和使用资源
在Android SDK中不仅提供了大量的系统资源,而且还允许开发人员定制自己的资源。
2.1、使用系统资源
在Android SDK中提供大量的系统资源,这些资源放在res目录中。可以在\platforms\android-1.5\data\res目录中找到这些资源。
代码引用格式:
android.R.resourceType.resourceId
其中resourceType表示资源类型,例如,string,drawable,color等。resourceId表示资源ID。
XML引用格式:
@android:resourceType/resourceId
2.2、字符串
字符串资源存放在res/string目录的XML文件中,定义格式是:value
示例:
应用名称
2.3、数组
字符串数据资源用标签定义,整数数组资源用标签定义。下面是array.xml文件示例:
- string a
- string b
- 100
- 200
读取时的代码示例:
String[] stringValues = getResources().getStringArray(R.array.string-value);
int[] integerValues = getResources().getIntArray(R.array.integer-value);
2.4、颜色资源
Android允许将颜色值作为资源保存在资源文件中。保存在资源文件中的颜色值以“#”开头,并支持如下四种表示方式:
- #RGB
- #ARGB
- #RRGGBB
- #AARRGGBB
其中R、G、B表示三原色,即红、绿、蓝,A表示通明度,即Alpha值。
颜色值定义在res/values目录的资源文件中。示例color.xml:
#F00
#0000FF
#5000FF00
#5FFF
2.5、尺寸资源
尺寸资源是一系列的浮点数组成的资源,这些资源在res/values目录的资源文件中定义,标签用来定义尺寸资源。示例dimension.xml文件:
50px
1.5in
50sp
Android支持的六种度量单位:
- px:表示屏幕实际的像素。
- in:表示英寸,即屏幕的物理尺寸,每英寸等于2.54厘米。例如形容手机屏幕大小,经常说3.2英寸、3.5英寸、4英寸等就是指这个单位。这些尺寸是屏幕的对角线长度。
- mm:表示毫米,是屏幕的物理尺寸。
- pt:表示一个点,是屏幕的物理尺寸,大小为1英寸的1/72。
- dp:与密度无关的像素,是一个基于屏幕物理密度的抽象单位。密度可以理解为每英寸包含的像素点的个数(单位:dpi),1dp实际上相当于密度为160dpi的屏幕的一个点。也就是说,如果屏幕的物理密度是160dpi时,dp和px是等效的数值。
- sp:与比例无关的像素。这个单位和dp类似。但除了自适应屏幕密度外,还会自适应用户设置的字体。因此,Android官方推荐在设置字体大小时应尽量使用sp作为尺寸单位。
2.6、类型资源
虽然可以在XML布局文件中灵活的设置组件的属性,但如果有很多组件都需要设置同一值,那么每个组件都设置各自的属性值就比较麻烦。而类型资源可以解决这个问题。
类型资源实际上就是将需要设置相同的值的属性提取出来放在单独的地方,然后在每一个需要设置这些属性的组件中引用这些类型。这种效果有些类似于面向对象中的方法。将公共的部分提取出来,然后在多个方法中调用这个执行公共代码的方法。
类型在res/values目录中定义。每一个
或者可以采用下面的形式标明继承关系:
2.7、主题资源
主题也是类型,只是这种类型只能使用于和标签。其中用于定义Activity,该标签是的子标签。如果在标签中使用主题,那么所有在标签中的都会继承这个主题。在中使用主题可以覆盖的主题。
2.8、绘画资源
在Android应用程序中经常使用到很多图像,这些图像资源保存在res/drawable目录下。Android支持很多常用的图片格式,例如jpg,png,bmp,gif(不包括动画gif)。
Android SDK还支持一种绘制颜色的Drawable资源,这种资源需要在res/values目录中的资源文件中配置。配置文件和颜色资源类似,只是要使用标签,如下:
#0000FF
#FFFF00
XML布局文件中引用方法:
android:textColor="@drawable/yellow"
android:background="@drawable/blue"
/>
代码中引用方法:
Drawable drawable = getResources().getDrawable(R.drawable.yellow);
2.9、动画资源
Android SDK支持两种2D动画:帧(Frame)动画和补间(Tween)动画。这两种动画都由动画文件控制,这些动画文件必须放在res/anim目录中。其中涉及到的图像文件仍然要放在res/drawable目录中。动画文件及其相关的图像文件统称为动画资源。
帧动画由若干幅图组成,通过设置每幅图的停留时间,可以控制播放的快慢。补间动画首先要设置目标(可以是图像、组件等元素)的开始状态和结束状态,以及动画效果等参数,然后由系统自动生成中间状态的目标形状和位置。
2.10、菜单资源
菜单除了可以使用Java代码定义外,还可以使用XML文件来定义。这些定义菜单的XML文件称为菜单资源。菜单资源必须放在res/menu目录中。
菜单资源文件必须使用