与其他平台的应用程序一样,Android中的应用程序也会使用各种资源,比如图片,字串等,会把它们放入源码的相应文件夹下面,Android也支持并鼓励开发者把UI相关的布局和元素,用XML资源来实现。总结起来,Android中支持的资源有:
•颜色值 /res/values 以resources为Root的XML文件,定义形式为<color name>value</color>
•字串 /res/values 以resources为Root的XML文件<string name>value</string>
•图片 /res/drawable 直接放入,支持9 Patch可自由拉伸
详细解释:
Android提供了一个自定义的2D图形库来绘制图像和图像.在android.graphics.drawable包中你就可以找到这些用于2维绘画的通用类.
Drawable是通常指的那种可以作画的东西的抽象.你将发现Drawable类扩展出了很多特定的可绘图形类,包括BitmapDrawable,ShapeDrawable,PictureDrawable,LayerDrawable,等等.当然,你也可以从它们派生出你自己的类来定义你自己的Drawable对象,并且以你独有的方式来表现.
有三种方法来定义并实例化一个Drawable:使用一个保存在你的项目资源中的图像;使用一个定义了Drawable属性的XML文件;或使用普通的类对象构造方式.
1.从资源中的图像创建
添加图形到你的应用的一个简单的方式是从你的项目资源中引用一个图像文件.支持的文件格式有PNG(首选),JPG (可接受)和GIF(不推荐).此技术优先用于程序图标,logo,或其它图形,比如用于游戏中的.
要使用一个图像资源,只需把你的文件添加到项目的res/drawable/文件夹下.从这里,你可以在你的代码或XMLlayout中引用它.不论从哪里引用,推荐使用一个资源ID,它是不带扩展名的文件名(例如,my_image.png的ID是my_image).
注:图像资源放在res/drawable/下,可能会在构建过程中自动被aapt工具无损压缩以进行优化.例如,一个不需要超过256种颜色的真彩色PNG可能被转换成一个带有调色板的8位PNG.这将造成保持图像质量不变的情况下,占用更少的内存.所以要注意放在这个文件夹下的图像在构建期间可能会改变.如果你想把一个图像作为比特流读入以转换成一个bitmap,那么应把你的图象放在res/raw/文件夹下,在这里他们不会被优化.
如果你想创建一个Drawable对象,你就可以在在你的XML中定义Drawable,并且把文件保存到项目的res/drawable/文件夹下.然后,通过调用Resources.getDrawable()方法获取并实例化这个对象,把你的XML文件的资源ID传给这个函数。
•图片的颜色 /res/values 以resources为Root的XML文件,定义形式为<drawable name>value</drawable>
•单位资源 /res/values 以resources为Root的XML文件<dimen name>value</dimen>
•菜单 /res/menu 以menuo为root的XML文件
•布局 /res/layout 这个就是GUI的布局和元素 (被编译为屏幕布局(或屏幕的一部分)的XML文件)
•风格和主题 /res/values 以resources为Root的XML文件<style name>value</style>
•动画 /res/anim 有二种:一个是帧动画(frame animation),也就是连续变换图片以animation-list为Root的XML文件;另外一种就是补间动画(tweened
animation),它对应于API中的Animation和AnimationSet,有translate、scale、rotate、alpha四种,以set为root来定义,这个set就相当于AnimationSet
目录:
•/res/anim 用于存放动画
•/res/drawable 存放图片,或等同于图片的资源如shape,或selector
详细解释:
在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。
drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:
(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。
Android的icon尺寸
在运行时,程序为最佳显示效果提供了三种方法:
1.图片缩放
基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。如果图片不匹配,平台会加载默认资源并且在放大或者缩小之后可以满足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如图片),如果没有,平台会将中精度资源缩放至高精度。
2.自动定义像素尺寸和位置
如果程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和 精度160的屏幕上一样能显示出同样尺寸的效果。例如,要让WVGA高精度屏幕和传统的HVGA 屏幕一样显示同样尺寸的图片,当程序不支持时,系统会对 程序慌称屏幕分辨率为320×533,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)到 (150,150)的屏幕显示区域。
3.兼容更大尺寸的屏幕
当前屏幕超过程序所支持屏幕的上限时,定义supports- screens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA 中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320×480的,多余的显示区域会被填充成黑色。
但为了达到最佳的显示效果,最好的方法还是设计多套图片。那就有必要对于所有的屏幕依据精度值进行分级(高中低),之后再设计三套icon:
•/res/menu 存放Menu
•/res/values 存放修饰性资源:字串,颜色,单位,风格和主题
详细解释:
values文件可以被编译成很多种类型的资源的XML文件。注意:
values文件夹不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方。 尽管这个文件夹里的文件可以任意命名,但还是要遵循一定的惯例(文件命名的惯例是将元素类型包含在该名称之中):
array.xml 定义数组
colors.xml 定义color drawable和颜色的字符串值(color string values)
使用Resource.getDrawable()和Resources.getColor()分别获得这些资源。
dimens.xml定义尺寸值(dimension value)。
使用Resources.getDimension()获得这些资源。
strings.xml定义字符串(string)值
使用Resources.getString()或者Resources.getText()获取这些资源。
styles.xml 定义样式(style)对象
res/xml/ 任意的XML文件,在运行时可以通过调用Resources.getXML()读取。
res/raw/ 直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename。
自动生成的R class 在项目文件夹的gen文件夹里面有个R.java,我们平常引用的资源主要引用这个类的变量。 注意:R类是自动生成的,并且它不能被手动修改。当资源发生变动时,它会自动修改。
在代码中使用资源:下面是一个引用资源的语法:R.resource_type.resource_name 或者 android.R.resource_type.resource_name 其中resource_type是R的子类,保存资源的一个特定类型。resource_name是在XML文件定义的资源的name属性,或者有其他文件类型为资源定义的文件名(不包含扩展名,这指的是drawable文件夹里面的icon.png类似的文件,name=icon)。Android包含了很多标准资源,如屏幕样式和按钮背景。要在代码中引用这些资源,必须使用android进行限定,如android.R.drawable.button_background。
•/res/layout 存放UI布局和元素
•/res/raw 存放运行时想使用的原始文件
•/assets 存放运行时想使用的原始文件
assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译,可以存放一些图片,html,js,
css等文件。
R.java文件
除了原始文件目录/res/raw和/assets以外,其他的资源在编译的时候都会被第三方软件aapt进行处理,一个是把图片和XML文件进行处理,例如把XML编译成为二进制形式;另外处理的目的就是生成R.java文件,这个文件是访问资源时必须要用到的。
/res目录下面的所有文件都会映射到R.java文件中,以整数Id的形式被标识,相同类型的资源被一个内部类来封装。
在/res中定义或提供资源时的注意事项:
1. 同一个类型,或同一文件夹下面的资源不可以使用相同的文件名,也就是说不能用文件扩展名来区别不同的文件,因为R.java中只保留资源的文件名而不管扩展名,所以如果有二个图片一个是icon.png另一个是icon.jpg,那么在R.java中只会有一个R.drawable.icon。另外一个则会无法访问到。
2. 资源文件的名字必须符合Java变量的命名规则,且不能有大写,只能是'[a-z][0-9]._',否则会有编译错误,因为R.java中的变量Id要与资源中的文件一一对应,也就是说用资源文件名来作为Id的变量名,所以一定要符合Java变量的命名规则,另外它还不能有大写。
3. 除了SDK支持的folder外,不能再有子Folder,虽不会有编译错误,但是子Folder会被完全忽略,如在/res/layout下在建一个子Folder activity(/res/layout/acitivity/,
那么你在生成的R.java中是看不到activity和其内的内容的。
4. 对于资源文件的大小有限制,最好不要让单个文件大于1M,这是SDK文档说明的限制,但具体的我没有进行试验(据说2.2版本以后的可支持到10M,不知道是真的还是假的)
5. 所有/res下面的资源都能通过Resources()并提供Id来访问。
对于大多数资源在编译时会对文件内容进行特殊处理,以方便Apk在运行时访问。
如果想要运行时使用未经处理的原始资源,可以把资源文件放在/res/raw和/assets目录下面