现在的位置: 首页 > 综合 > 正文

第六章 Android应用的资源

2016年08月28日 ⁄ 综合 ⁄ 共 6167字 ⁄ 字号 评论关闭

6.1 资源的类型及存储方式:

   Android应用资源可分为两大类:

    (1)、无法直接访问的原生资源,保存在assets目录下,应用程序需要通过AssetManager以二进制的形式来读取资源;

    (2)、可通过R资源清单类访问的资源,保存在res目录下,在编译应用的时候,会自动在R.java文件中为这些资源创建索引。

   6.1.1  资源的类型以及存储方式:

    如下:/res/anim/   存放动画的XML文件;

         /res/color/   存放定义不同状态下颜色列表的XML文件;

         /res/drawable/  存放各种位图文件(如*.png、*.9.png、*.jpg、*.gif),除此之外还有各种Drawable对象的XML文件(包括BitmapDrawable、AnimationDrawable等其他各种子类的对象)( 注:*.9.png是一种非失真性压缩位图图形文件格式。1、允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更大区域时,可扩展区的内容被延展。2、允许开发人员定义内容显示区,用于显示文字或其他内容);

        /res/layout/   存放各种用户界面的布局文件;

        /res/menu/   存放为应用程序定义各种菜单的资源,包括选项菜单、子菜单、上下文菜单资源等;

        /res/raw/   存放任意类型的原生资源,在java代码中可通过Resources对象的openRawResource(int id)方法来获取该资源的二进制输入流;

       注:如果应用程序需要使用原生资源,推荐把这些原生资源保存到/assets目录下,然后在应用中使用AssetsManager来访问这些资源;

        /res/values/    存放各种简单值的XML文件,这些简单值包括字符串值、整数值、颜色值、数组等(建议的资源文件的命名:arrays.xml,colors.xml,dimens.xml,strings.xml,styles.xml等);

 (提示:系统提供了drawable-ldpi(低分辨率)、drawable-mdpi(中等分辨率)、drawable-hdpi(高分辨率)三个子目录,这三个子目录的作用就相当于drawable子目录。大部分程序,系统会选择drawable-mdpi目录下的图片文件,如果系统使用高分屏,那么系统将会选择drawable-hdpi目录下的图片文件)。

     6.1.2 使用资源

     1、在java代码中使用资源

           [<package_name>.]R.<resource_type>.<resource_name>

          <package_name>:指定R类所在包,实际上就是使用全限定类名;

          <resource_type>:R类中代表不同资源类型的子类;

          <resource_name>:指定资源的名称。

     2、在Xml代码中使用资源

          @[<package_name>:]R.<resource_type>/<resource_name>

    6.2 使用字符串、颜色、尺寸资源

       Android颜色值支持常见的四种形式:#RGB、#ARGB、#RRGGBB、#AARRGGBB

   与定义字符串资源类似的是,Android也允许使用资源文件来定义boolean常量(也可以是整形常量),可在/res/values目录下增加一个boolean.xml文件(文件名自由选择)。

如下:...........

     <resources>

          <boolean name="is_male">true</bool>

     </resources>

      6.3数组(Array)资源

          数组元素包含三种子元素,如下:

            1、<array.../>子元素:定义普通类型的数组(如:Drawable数组);

            2、<string-array.../>子元素:定义字符串数组;

            3、<integer-array.../>子元素:定义整形数组。

Resource提供如下方法:

1、intgertStringArray(int id):根据资源文件中字符串数组资源的名称来获取实际的字符串数组;

2、int getIntArray(intid):根据资源文件中整形数组资源的名称来获取实际的整形数组;

3、TypedArrayobtainTypedArray(int id):根据资源文件中普通数组资源的名称来获取实际的普通数组。

注意:TypedArray代表一个通用类型的数组,该;类提供了getXxx(int index)方法来获取指定的索引处的数组元素。

6.4 使用(Drawable)资源

    注:Android不允许图片资源文件名中出现大写字母,且不能以数字开头。否则AndroidSDK 无法为该图片在R类中生成资源索引

6.4.2 StateListDrawable资源

   StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示的Drawable对象会随目标组件状态的改变而自动切换。

    定义StateListDrawable对象的XML文件的根元素为<selector../>,该元素可以包含多个<item../>元素。它的属性有android:color指定颜色,android:drawable指定Drawable对象,android:state_xxx(其中有:checkable可勾选状态、checked已勾选状态、enabled可用状态、first开始状态、focused已得到焦点状态、last结束状态、middle中间状态、pressed已被按下状态、selected已被勾选状态、state_window_focused窗口已得到焦点状态):指定一个特定的状态。

6.4.3 LayerDrawable资源

    与StateListDrawble类似,LayerDrawable包含一个Drawable数组,系统按这些Drawable对象的数组顺序绘制,索引最大的Drawable对象将被绘制在最上面。

    定义LayerDrawable对象的XML文件的根元素为<layer-list.../>,该元素可以包含多个<item../>元素。它的元素有android:drawable指定作为LayerDrawable元素之一的Drawable对象,android:id为该Drawable对象指定一个标识。android:buttom|top|left|button用于指定将该Drawable对象绘制到目标组件的指定位置。

6.4.4 ShapeDrawable资源

 ShapeDrawable用于定义一个基本的几何图形,定义ShapeDrawable的XML文件的根元素是<shape../>元素。它的元素有android:shape=["rectangle"| "oval"|"line"|"ring"];

6.4.5 ClipDrawable资源

 ClipDrawable代表从其他位图上截取的一个"图片片段"。它的属性有android:drawable指定截取的源Drawable对象,android:clipOrientation指定截取方向,可设置水平截取或垂直截取,android;gravity指定截取时的对齐方式。另外使用ClipDrawable对象时可调用setLevel(int level)方法来设置截取的区域大小。setLevel()可实现图片徐徐展开的效果。

6.4.6 AnimationDrawable资源

Android既支持传统的逐帧动画(图片的切换),也支持通过平移、变换计算出来的补间动画。

    定义补间动画的XML资源文件以<set.../>元素作为根元素。它的元素有alpha设置透明度的改变,scale设置图片进行缩放,translate设置图片进行位移变换,rotate设置图片进行旋转。

   //加载动画资源

  final Animation anim=AnimationUtils.loadAnimation(this,R,anim.my_anim);

  //设置动画结束后保留结束状态

 anim.setFillAfter(true);

  //开始动画

 image.startAnimation(anim);

6.5 使用原始XML资源

 通过Resources的两个方法来获取Xml文件

1、XmlResourceParsegetXml(int id):获取XML文档,并使用一个XmlPullParser来解析XML文档,该方法返回一个解析器对象(XmlResourceParser是XmlPullParser的子类)。

2、InputStreamopenRawResource(int id):获取XML文档对应的输入流。

Android平台已经内置了Pull解析器,而且Android本身也使用Pull解析器来解析各种XML文档,因此Androi推荐开发者Pull解析器来解析XML文档。

6.5.2 使用原始XML文件

6.7  使用菜单(Menu)资源

   6.7.1 定义菜单资源

  菜单资源文件通常应该放在/res/menu目录下,菜单资源的根元素通常是<menu.../>元素,它包含的元素有item定义菜单项,group将多个定义的菜单包装成一个菜单组checkableBehavior:指定该组菜单的选择行为,menuCategory对菜单进行分类,指定菜单的优先级,visiable指定该组菜单是否可见,enable指定该组菜单是否可用。其中item元素用于定义一份菜单项,包含的元素有id、title、icon等。

 @override

 public boolean onCreateOptionsMenu(Menu menu){

  MenuInflater  inflater=newMenuInflater(this);

  inflator.inflate(R.menu.my_menu,menu);

  return super.omCreateOptionMenu(menu);

  @override

public void onCreateContextMenu(ContextMenumenu,View source,ContextMenu.ContextMenuInfo menuInfo){

    MenuInflater inflater=new MenuInflater(this);

     inflater.inflate(R.menu.context,menu);

}

6.8  样式(Style)和主题(Theme)资源

   6.8.1 样式资源

  样式资源文件的根元素是<resources.../>元素,该元素内可包含多个<style.../>子元素,每个<style.../>元素定义一个样式。它包含的属性有name指定样式的名称,parent指定该样式所继承的父样式(当继承某个父样式时,该样式将会获得父样式中定义的全部格式,也可以覆盖父样式中指定的格式)。

  6.8.2主题资源

   主题与样式的区别主要体现在:

1、主题不能作用于单个的View组件,主题应该对整个应用中的所有Activity起作用,或对指定的Activity起作用。
2、主题定义的格式应该是改变窗口外观的格式,例如窗口标题、窗口边框等。

主题的设置有两种方法:

一个主题的名字是CrazyitTheme
1、在java代码里

 setTheme(android.R.style.CrazyitTheme);

2、在AndroidManifest.xml文件中对指定应用、指定Activity应用主题更加简单

可在<application.../>或<activity.../>元素中添加android:theme="@style/CrazyTheme"

 

如果想要利用某个系统的主题,对它进行局部修改,则可通过继承系统主题来实现自定义主题

<style name="CrazyitTheme"parent="@android:style/Theme.Dialog">

6.9 属性(Attribute)资源

  属性资源文件的根元素也是<resources.../>,该元素里包含两个元素,attr子元素,定义一个属性,declare-styleable子元素,定义一个styleable对象,每个styleable对象就是一组attr属性的集合。

6.10 使用原始资源

除了之前介绍的各种XML文件、图片文件之外,android应用可能还需要用到大量其他类型的资源,比如声音资源等。

AssetManager是一个专门管理/assets/目录下原始资源的管理类,AssetManager提供了如下两个常用方法来访问Assets资源。

1、InputStreamopen(String fileName):根据文件名来获取原始资源对应的输入流。

2、AssetFileDescriptoropen(String fileName):根据文件名来获取原始资源对应的AssetFileDescriptor。AssetFileDescriptor代表了一项原始资源的描述,应用程序可通过AssetFileDescriptor来获取原始资源。

6.11 国际化和资源自适应

 java程序的国际化主要通过三个类完成:

1、java.util.ResourceBundle用于加载一个国家、语言资源包;

2、java.util.Locale 用于封装一个特定的国家/区域、语言环境;

3、java.text.MessageFormat用于格式化带占位符的字符串。

java不可能支持所有的国家和语言,如需要获取java所支持的语言和国家,可调用Locale类的getAvailableLocales方法获取,该方法返回一个Locale数组,该数组里包含了Java所支持的语言和国家。

例如:

1、res\values-en-rUS目录下的string.xml是美式英语的字符串资源文件;

2、res\values-zh-rCN目录下的string.xml是简体中文的字符串资源文件。

 

6.12 本章总结

    首先本章主要介绍了Android应用资源的存储方式、Android应用资源的使用方式;Android应用的字符串资源、颜色资源、尺寸资源、数组资源、图片资源、各种Drawable资源、原始XML资源、布局资源、菜单资源、样式和主题资源、属性资源、原始资源等各种资源文件。

    其次介绍了Android应用的国际化

抱歉!评论已关闭.