应用资源可以分为两大类:
1、无法直接访问的原生资源,保存在asset目录下。
2、可以通过R资源清单类访问的资源,保存在res目录下。
资源的类型以及存储方式:
android要求在res目录下用不同的子目录来保存不同的应用资源:
资源的使用:
由于android SDK会在编译应用时在R类中为/res目录下的所有资源创建索引项,因此在java代码中访问资源主要是通过R类来完成:
[<package_name>.]R.<resource_type>.<resource_name>
package_name:指定R类所在的包
resource_type:R类中代表不同资源类型的子类
resource_name:指定资源的名称
XML文件中使用资源:
@[<package_name>.]<resorce_type>/<resource_name>
package_name:指定R类所在的包
resource_type:R类中代表不同资源类型的子类
resource_name:指定资源的名称
字符串、颜色、尺寸资源:
他们对应的XML文件都在/res/values目录下:
颜色值的定义:android中的颜色是通过红、绿、蓝三原色和透明度来标示的,颜色值总是以井号(#)开头,接下来是:Alpha-Red-Green-Blue的形式。其中Alpha值可以省略。如果省略了Alpha值,那么颜色默认是完全不透明的。
android中颜色的四种形式:
#RGB、#ARGB、#RRGGBB、#AARRGGBB
定义字符串、颜色、尺寸资源文件:
字符串资源文件:
定义颜色资源文件:
定义尺寸资源文件:
资源的使用通过前面说的办法使用。
android也允许使用资源文件来定义boolean常量和整形常量:
例如:booleans.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="is_male">true</bool> <bool name="is_big">false</bool> </resources>
java代码中访问:
Resources resources = getResources(); boolean is_big = resources.getBoolean(R.bool.is_big);
整形常量的类似boolean类型,只是<bool....../>变成了 <integer......>
数组(Array)资源:
资源文件位于/res/values目录下,xml文件的根元素也是<resources....../>,该元素可以包含如下三种子元素:
1、<array....../>:定义普通的数组
2、<string-array....../>:定义字符串数组
3、<integer-array....../>:定义整数数组
java代码中通过如下的方式访问:
[<package_name>.]R.array.array_name
xml文件中如下访问:
@[<package_name>:]array.array_name
Resource也提供了相应的方法访问数组中的数据。
字符串数组实例:
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="dt"> <item>one</item> <item>two</item> </string-array> </resources>
其他的数组资源的xml文件定义类似字符串数组的定义。
Drawable资源:通常保存在/res/drawable目录下。
图片资源:图片资源是最简单的Drawable资源,我们只要把图片放入/res/drawable-xxx目录下,android SDK就会在编译应用自动加载该图片,并在R资源清单类中生成该资源的引用。
注:android不允许图片资源的文件名中出现大写字母,且不能以数字开头。否则android SDK无法为该图片在R类中生成资源的索引。
StateListDrawable资源:StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示Drawable对象会随目标组件的改变而自动切换。
定义StateListDrawable对象的XML文件的根元素是<selector....../>,该元素可以包含多个<item....../>元素。
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:color = "#FFF" android:state_pressed="true"> </item> </selector>
LayerDrawable资源:LayerDrawable也可以包含一个Drawable数组,系统将会按这些Drawable对象的数组顺序绘制他们,索引最大的Drawable对象将会被绘制在最上面。
定义LayerDrawable对象的XML文件的根元素为<layer-list....../>,该元素可以包含多个<item....../>元素。
定义xml格式如下:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" /> </layer-list>
<layer-list....../>中可以包含多个<item....../>元素。
LayerDrawable资源的效果如下:
ShapeDrawable资源:用于定义一个基本的几何图形(如矩形、圆形、线条等),定义ShapeDrawable的XML的根元素是<shape....../>。
xml格式如下:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape=["rectangle" | "oval" | "line" | "ring"] > <!--定义几何图形的四个角的弧度--> <corners android:radius="integer" android:topLeftRadius="integer" android:topRightRadius="integer" android:bottomLeftRadius="integer" android:bottomRightRadius="integer" /> <!--定义使用渐变色填充--> <gradient android:angle="integer" android:centerX="integer" android:centerY="integer" android:centerColor="integer" android:endColor="color" android:gradientRadius="integer" android:startColor="color" android:type=["linear" | "radial" | "sweep"] android:useLevel=["true" | "false"] /> <!--定义几何图形的内边距--> <padding android:left="integer" android:top="integer" android:right="integer" android:bottom="integer" /> <!--定义几何图形的大小--> <size android:width="integer" android:height="integer" /> <!--定义使用单种颜色填充--> <solid android:color="color" /> <!--定义为几何形状绘制边框--> <stroke android:width="integer" android:color="color" android:dashWidth="integer" android:dashGap="integer" /> </shape>
ClipDrawable资源:代表从其他位图上截取一个“图片片段”。
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:clipOrientation=["horizontal" | "vertical"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] />
使用ClipDrawable对象时可以调用setLevel(int level)方法来设置截取的区域大小,当level为0时,截取图片片段为空,当level为10000时,截取整张图片。
AnimationDrawable资源:代表一个动画资源
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@[package:]anim/interpolator_resource" android:shareInterpolator=["true" | "false"] > <alpha android:fromAlpha="float" android:toAlpha="float" /> <scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotX="float" android:pivotY="float" /> <translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" /> <rotate android:fromDegrees="float" android:toDegrees="float" android:pivotX="float" android:pivotY="float" /> <set> ... </set> </set>
定义动画的XMl资源应该放在/res/anim路径下,当使用ADT创建一个Android应用时,默认是不会包含该路径的,需要自己手工建立。
android:interpolator:该属性指定动画的变化速度,可以实现匀速、正加速、负加速、无规则加速等。android系统的R.anmi类中包含一些常量定义了不同的动画速度:
1、linear_interpolator:匀速变换
2、accelerate_interpolator:加速变换
3、decelerate_interpolator:减速变换
android:shareInterpolator:可以设置<set....../>下的所有变换效果是否使用相同的动画速度。
java代码中使用动画效果:为了获取实际的Animation对象,则可调用AnimationUtils的loadAnimation(Context, int resId)方法。
btn = (Button)findViewById(R.id.btn); imageView = (ImageView)findViewById(R.id.imageView); // 加载动画资源 final Animation animation = AnimationUtils.loadAnimation(this, R.anim.my_anmi); // 设置动画结束后保留结束状态 animation.setFillAfter(true); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 开始动画 imageView.startAnimation(animation); };
使用原始的XML资源:原始的XML资源一般保存在/res/xml路径下------当ADT创建应用时/res目录下并没有包含xml目录,需要手动建立。android对原始的xml文件没有特殊的要求,只要格式良好就ok。
方法原始xml文件的方法:
1、xml文件中访问:@[<package>.]R.xml.<file_name>
2、java代码中访问:[<package>.].R.xml.<file_name>
java代码中可以通过Resources的下面方法获取实际的xml文档:
1、XmlResourceParser getXml(int id):获取XML文档,并使用一个XmlPullParser来解析XML文档,该方法返回一个解析器对象(XmlResourceParser是XmlPullParser的子类)。
2、InputStream openRawResource(int id):返回xml文档对应的输入流。
android中使用pull解析器对XML文档进行解析,pull解析器采用的是事件驱动方式对XML文档进行解析,pull解析器是开源的。android中内置了pull解析器。
简单XML解析事例:
1.<?xml version="1.0" encoding="UTF-8"?> 2.<books> 3. <book id="12"> 4. <name>thinking in java</name> 5. <price>85.5</price> 6. </book> 7. <book id="15"> 8. <name>Spring in Action</name> 9. <price>39.0</price> 10. </book> 11.</books>
11.public class PullParseService { 12. public static List<Book> getBooks(InputStream inputStream) throws Exception{ 13. List<Book> books = null; 14. Book book = null; 15. XmlPullParser parser = Xml.newPullParser(); 16. parser.setInput(inputStream, "UTF-8"); 17. 18. int event = parser.getEventType();//产生第一个事件 19. while(event!=XmlPullParser.END_DOCUMENT){ 20. switch(event){ 21. case XmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件 22. books = new ArrayList<Book>();//初始化books集合 23. break; 24. case XmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件 25. if("book".equals(parser.getName())){//判断开始标签元素是否是book 26. book = new Book(); 27. book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id 28. } 29. if(book!=null){ 30. if("name".equals(parser.getName())){//判断开始标签元素是否是name 31. book.setName(parser.nextText()); 32. }else if("price".equals(parser.getName())){//判断开始标签元素是否是price 33. book.setPrice(Float.parseFloat(parser.nextText())); 34. } 35. } 36. break; 37. case XmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件 38. if("book".equals(parser.getName())){//判断结束标签元素是否是book 39. books.add(book);//将book添加到books集合 40. book = null; 41. } 42. break; 43. } 44. event = parser.next();//进入下一个元素并触发相应事件 45. }//end while 46. return books; 47. } 48.}
1.public class Book { 2. private int id; 3. private String name; 4. private float price; 5. public int getId() { 6. return id; 7. } 8. public void setId(int id) { 9. this.id = id; 10. } 11. public String getName() { 12. return name; 13. } 14. public void setName(String name) { 15. this.name = name; 16. } 17. public float getPrice() { 18. return price; 19. } 20. public void setPrice(float price) { 21. this.price = price; 22. } 23. @Override 24. public String toString(){ 25. return this.id+":"+this.name+":"+this.price; 26. } 27.}
布局(Layout)资源:资源文件应放在/res/layout目录下。