Android资源访问

作者: MrLgc | 来源:发表于2019-02-14 14:20 被阅读3次

    Android资源访问

    一、资源访问:【掌握】
    (一)、概念:
    Android中的资源是指可以在代码中使用的外部文件,这些文件作为应用程序的一部分,被编译到应用程序中。在项目中,这些资源被保存到Android应用的res目录下。

    (二)、资源分类:
    id;
    字符串资源文件;
    颜色资源
    尺寸资源文件
    布局资源
    数组资源
    样式和主题资源
    菜单资源
    已编译的任意XML资源文件【重要】: res/xml
    未编译的原始资源文件: res/raw
    图像(Drawable)资源
    普通图像资源
    xml图像资源:bitmap
    图层(Layer)资源:layer-list , item
    图像选择器:图像状态(State)资源:selector , item
    图像级别(Level)资源:level-list , item
    淡入淡出(CrossFade)资源:transition , item(只支持两个)
    外形(Shape)资源:shape(shape , gradient , padding ,corners , stroke)
    动画资源
    逐帧动画: res/anim animation-list , item
    补间动画: res/anim
    透明度补间动画 alpha
    缩放补间动画 scale
    旋转补间动画 rotate
    移动补间动画 translate
    3、属性动画:res/animator

    【备注:】资源编译器会编译除了raw资源以外的所有资源,并将它们全部放到最终的.apk文件中。apk(Android Package)包含Android应用程序的代码和资源。
    13、attr资源:自定义View

    (三)、各种资源文件的xml格式:
    1、字符串资源文件:
    示例代码:

    <resources>
    <string  name="red">红色</color>
    <string  name="green">绿色</color>
    <string  name="blue">蓝色</color>
      </resources>
    
    Java文件中获取方式:getResources().getString(R.string.red);
    

    2、颜色资源文件:
    示例代码:

    <resources>
        <color name="red">#f00</color>
        <color name="green">#0f0</color>
        <color name="blue">#00f</color>
      </resources>
    
    在需要调用该颜色的地方写法是:android:background="@color/blue"
    
    Java文件中获取方式:getResources().getColor(R.color.blue);
    

    3、尺寸资源文件:
    示例代码:

    <resources>
        <dimen  name="title">20dp</color>
        <dimen  name="content">10dp</color>
      </resources>
    
    Java文件中获取方式:getResources().getDimension(R.dimen.title);
    

    4、数组资源文件:
    Android中,不推荐将数组直接定义在java文件中,而是使用数组资源文件来定义数组。
    定义在res下values目录下:arrays.xml文件中。格式如下:

    根元素:<resources></resources>
    子元素:可以有三种。
    <array></array>:称为类型数组Typed-Array资源(或者:资源数组资源)
    <string-array></string-array>
    <integer-array></integer-array>
    下级子元素:<item>数值</item>

    示例代码:

    <resources>
        <string-array name="choiceItems"> 
            <item >主屏模式</item>
            <item >wifi设置</item>
            <item >蓝牙设置</item>
            <item >网络设置</item>
            <item >More</item>
        </string-array>
    </resources>
    
    Java文件中获取方式:getResources().getStringArray(R.array.choiceItems);
    
    【备注:】如果是int型数组,则格式如下:
    <resources>
        <integer-array name="age"> 
            <item >20</item>
            <item >30</item>
            <item >40</item>
            <item >50</item>
        </integer-array>
    </resources>
    
    Java文件中获取方式:getResources().getIntArray(R.array.age);
    
    【备注:】如果是资源数组资源,则格式如下:
    <resources>
        <array name="icons"> 
            <item >@drawable/home</item>
            <item >@drawable/setting</item>
            <item >@drawable/logout</item>
        </array>
        <array name="title"> 
            <item >首页</item>
            <item >设置</item>
            <item >退出</item>
        </array>
    </resources>
    
    Java文件中获取方式:
    TypedArray  arrIcons = getResources().obtainTypedArray(R.array.icons);
    Drawable drawable = arrIcons.getDrawable(0);
    

    5、原始XML资源【重要】
    位置:res/xml目录下;
    定义格式:格式良好的,没有特殊要求的普通xml文件;
    Java文件中获取方式:getResources().getXml(R.xml.文件名称);
    解析xml的核心代码:

        // 从资源文件夹中读取原始xml资源文件
        XmlResourceParser pullParser = getResources().getXml(R.xml.citylist);
        //将读取xml资源文件返回的XmlResourceParser 对象继续解析,获取到xml节点中需要的数据。
        //备注:XmlResourceParser 类是XmlPullParser的子类
        public List<Map<String, Object>> parseXML(XmlResourceParser pullParser,
                            String tagName) {
                    List<Map<String, Object>> list = null;
                    Map<String, Object> map = null;
                    int event;
                    try {
                            // 根据读取的xml节点来获取事件类型
                            event = pullParser.getEventType();
                            // 只要不是文档结束就一直执行循环
                            while (event != XmlPullParser.END_DOCUMENT) {
                                    // 获取每个节点的节点名称
                                    String nodeName = pullParser.getName();
                                    // 根据事件类型来执行不同的操作
                                    switch (event) {
                                    // 当文档开始就实例化list
                                    case XmlPullParser.START_DOCUMENT:
                                            list = new ArrayList<Map<String, Object>>();
                                            break;
                                    // 根据节点的不同来执行实例化map和往map中添加数据的操作
                                    case XmlPullParser.START_TAG:
                                            if (nodeName.equals(tagName)) {
                                                    map = new HashMap<String, Object>();
                                                    // 本例中,没有文本节点,有n个属性节点,而所需要的内容全在属性节点中。故使用getAttributeValue(index)方法
                                                    // getAttributeValue(index)方法中的
                                                    // index是指节点的索引下标,从0开始。可以理解成属性点 顺序。
                                                    map.put(pullParser.getAttributeValue(3),
                                                                    pullParser.getAttributeValue(2));
                                                    list.add(map);
                                            }
                                            break;
                                    }
                                    // 执行循环
                                    event = pullParser.next();
                            }
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    return list;
            }
    
    

    6、原生文件资源: raw

    【备注:】raw目录下主要放置的资源有音频、视频等文件。raw目录下的文件会在R.java中被注册。
            如何访问raw目录下的文件?
            InputStream is = getResources().openRawResource(R.raw.文件名);
    

    7、图像资源:
    A、普通图像资源:

    Java文件中获取方式:getResources().getDrawable(R.drawable.imagename);
    
    int resId = getResources().getIdentifier(imgName, "drawable",  this.getPackageName());
    
    view.getResources().getResourceName(resid)
    
    int resId = context.getResources().getIdentifier("图片名称", "drawable", context.getPackageName()); 
    imageView_main_showpic.setImageResource(resId);
    

    B、xml图像资源:bitmap

    <bitmap
    
    android:src="@drawable/android1"
    
    android:gravity="center"/>
    

    C、图层(Layer)资源:layer-list

    <?xmlversion="1.0"encoding="utf-8"?>
    
    <layer-listxmlns:android="http://schemas.android.com/apk/res/android">
    
    <item
    
    android:top="10dp"
    
    android:left="10dp">
    
    <bitmap
    
    android:src="@drawable/android1"
    
    android:gravity="center"/>
    
    </item>
    
    <item
    
    android:top="10dp"
    
    android:left="10dp">
    
    <bitmap
    
    android:src="@drawable/android2"
    
    android:gravity="center"/>
    
    </item>
    
    </layer-list>
    

    D、图像状态(State)资源:selector

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/pressed"/>
    <item android:state_focused="true" android:drawable="@drawable/focused"/>
    <item android:drawable="@drawable/normal"/>
    </selector>
    

    E、图像级别(Level)资源:level-list

    //UI代码:

    <?xmlversion="1.0"encoding="utf-8"?>
    
    <level-listxmlns:android="http://schemas.android.com/apk/res/android">
    
    <item
    
    android:drawable="@drawable/lamp_off"
    
    android:minLevel=“5"   android:maxLevel="10"/>
    
    <item
    
    android:drawable="@drawable/lamp_on"
    
    android:minLevel=“11"  android:maxLevel="20"/>
    
    </level-list>
    
    
    //java代码:
    
    publicclass LevelActivity extends Activity {
    
    private ImageView imageview_lamp;
    
    
    @Override
    
    protectedvoid onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.activity_level);
    
    imageview_lamp = (ImageView) findViewById(R.id.imageview_lamp);
    
    }
    
    
    
    
    publicvoid clickButton(View view) {
    
    switch (view.getId()) {
    
    case R.id.button_level_lampoff:
    
    imageview_lamp.setImageLevel(9);
    
    break;
    
    case R.id.button_level_lampon:
    
    imageview_lamp.setImageLevel(15);
    
    break;
    
    default:
    
    break;
    
    }
    
    }
    
    }
    

    F、淡入淡出(CrossFade)资源:transition

    <?xmlversion="1.0"encoding="utf-8"?>
    
    <transitionxmlns:android="http://schemas.android.com/apk/res/android">
    
    <!-- transition标签中只能有两个item标签,也就是只支持两个图像的切换 -->
    
    <itemandroid:drawable="@drawable/lamp_off"/>
    
    <itemandroid:drawable="@drawable/lamp_on"/>
    
    </transition>
    
    //java代码:
    
    publicclass CrossfadeActivity extends Activity {
    
    private ImageView imageview_lamp;
    
    private TransitionDrawable drawable = null;
    
    
    
    
    @Override
    
    protectedvoid onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.activity_crossfade);
    
    imageview_lamp = (ImageView) findViewById(R.id.imageview_lamp);
    
    drawable = (TransitionDrawable) imageview_lamp.getDrawable();
    
    }
    
    publicvoid clickButton(View view) {
    
    switch (view.getId()) {
    
    case R.id.button_level_lampon:
    
    drawable.startTransition(3000);
    
    break;
    
    case R.id.button_level_lampoff:
    
    drawable.reverseTransition(3000);
    
    break;
    
    default:
    
    break;
    
    }
    
    }
    
    }
    

    G、外形(Shape)资源:shape

    <?xmlversion="1.0"encoding="utf-8"?>
    
    <shape
    
    xmlns:android="http://schemas.android.com/apk/res/android"
    
    android:shape="rectangle”>
    
    <!-- shape有四个值:rectangle(矩形)、oval(椭圆)、line(直线)、ring(圆环)-->
    
    <!-- 定义渐变色 ,从左下角到右上角绘制渐变色-->
    
    <gradient
    
    android:startColor="#FF00"
    
    android:endColor="#80FF00FF"
    
    android:angle="45"/>
    
    
    
    <!-- 定义控件内容到边界的距离-->
    
    <padding
    
    android:left="20dp"
    
    android:top="20dp"
    
    android:right="20dp"
    
    android:bottom="20dp"/>
    
    
    
    <!-- 定义边框线的宽度及颜色-->
    
    <stroke
    
    android:width="2dp"
    
    android:color="#00F"/>
    
    
    
    <!-- 定义圆角半径-->
    
    <corners
    
    android:radius="8dp"/>
    
    </shape>
    

    相关文章

      网友评论

        本文标题:Android资源访问

        本文链接:https://www.haomeiwen.com/subject/uhzseqtx.html