• android应用的资源


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

    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目录下。

  • 相关阅读:
    【原创】cs+html+js+css模式(一):初识新模式
    【原创】cs+html+js+css模式(三):RemoteCallHandler详解
    删除表数据
    【原创】cs+html+js+css模式(二):webconfig中的设置
    silverlight动画
    rdlc报表表达式应用(字符串和转换)
    Accordion控件制作下拉面板菜单(静态数据)
    silverlight三种布局
    Sys.UI.DomElement
    Accordion控件动态数据绑定案例
  • 原文地址:https://www.cnblogs.com/heml/p/3564882.html
Copyright © 2020-2023  润新知