Android资源使用详解(二)

      Drawable资源通常保存在/res/drawable目录,可分为图片资源(*.png、*.jpg、*.gif等格式)、XML资源等,Android SDK会在编译应用中自动加载该图片资源,并在R资源清单类中生成该资源的索引。使用方法如下:
    Java代码中:[<package_name>.]R.drawable.<file_name>
    xml代码中:[<package_name>.]@drawable/<file_name>
为了在程序中获得实际的Drawable对象,Resources提供了Drawable getDrawable(int id)方法来获得实际的Drawable对象。
1.StateListDrawable资源
    StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示的Drawable对象会随目标组件状态的改变自动切换。定义StateListDrawable对象的XML文件的根元素为<selector../>,
该元素可以包含多个<item../>子元素,该元素可指定如下属性:
   >android:color或android:drawable:指定颜色或Drawable对象;
   >android:state_xxx:指定一个特定状态;



2.LayerDrawable资源

    与StateListDrawable有点类似,LayerDrawabe也可以包含一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。定义LayerDrawable对象的XML文件的根元素为<layer-list.../>,该元素可以包含多个<item.../>元素,该元素可指定如下属性:
    >android:drawable:指定作为LayerDrawable元素之一的Drawable对象;
    >android:id:为该Drawable对象指定一个标识;
    >android:butom/top/left/Right:用于指定一个长度值指定将该Drawable对象绘制到目标组件的指定位置.
语法格式如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list  xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 指定一个Drawable元素 -->
    <item 
            android:id="@android:id/background"
            android:drawable="@drawable/grow"/>
</layer-list>

源码实战:自定义进度条的风格
(1)res/drawable/mybar.xml
功能:进度条外观风格
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    	<!-- 指定一个Drawable元素,用于定义进度条轨道背景 -->
    	<item 
    	    android:id="@android:id/background"
    	    android:drawable="@drawable/image02"/>
<!-- 指定一个Drawable元素,用于定义轨道上已完成部分的外观-->
<item 
    android:id="@android:id/progress"
    android:drawable="@drawable/image01"/>
</layer-list>
注意:@android:id/background和@android:id/progress标明Drawable元素的ID,是Android系统自带的,均有各自的功能,用户不能自行定义i。
(2)res/drawable/layout_logo/xml
功能:图片叠加效果
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/image03" />
    </item>
    <item
        android:left="25dp"
        android:top="25dp">
        <bitmap
            android:gravity="center"
            android:src="@drawable/image01" />
    </item>
    <item
        android:left="50dp"
        android:top="50dp">
        <bitmap
            android:gravity="center"
            android:src="@drawable/image02" />
    </item>
</layer-list>
(3)MainActivity.java
功能:通过子线程模拟进度条进度
package com.example.layerdrawabletest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ProgressBar;


public class MainActivity extends Activity {
  private int[] data = new int[100];  
  int hasData = 0;  
  int status = 0;  
  ProgressBar bar;  
  // 创建一个负责更新的进度的Handler  
  Handler handler = new Handler() {  
   public void handleMessage(android.os.Message msg) {  
    if (msg.what == 0x111) {  
     bar.setProgress(status);  
    }  
   };  
  };  
  @Override  
  protected void onCreate(Bundle savedInstanceState) {  
   super.onCreate(savedInstanceState);  
   setContentView(R.layout.main);  
   bar = (ProgressBar) findViewById(R.id.progressBar);  
   // 启动线程来执行任务  
   new Thread(new Runnable() {  
    public void run() {  
     while (status < 100) {  
      status = doWork(); // 获取耗操作的完成百分比  
      handler.sendEmptyMessage(0x111); // 发送消息  
     }  
    }  
   }).start();  
  }  
  // 模拟一个耗时任务  
  public int doWork() {  
   data[hasData++] = (int) (Math.random() * 100);  
   try {  
    Thread.sleep(100);  
   } catch (InterruptedException e) {  
    e.printStackTrace();  
   }  
   return hasData;  
  }  
}
(4)效果演示


3.ShapeDrawable资源
    ShapeDrawable用于定义一个基本的几何图形(如矩形、圆形、线条等),定义ShapeDrawable的XML文件的根元素是<shape.../>元素,该元素可指定如下属性:
   >android:shape=["rectangle"|"oval"|"line"|"ring"]:指定定义哪种类型的几何图形
另外,<shape../>元素下可以包含多个子元素,如<corners../>、<gradient.../>等
    定义ShapeDrawable对象的完整语法格式如下:
  1. <? xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.          android:shape=["rectangle"|"oval"|"line"|"ring"]>  
  4. <!-- 定义几何图形的四个角的弧度 -->   
  5. <corners  
  6.         android:radius="integer"  
  7.         android:topLeftRadius="integer"  
  8.         android:topRightRadius="integer"  
  9.         android:bottomLeftRadius="integer"  
  10.         android:bottomRightRadius="integer"/>  
  11. <!-- 定义使用渐变色填充 -->   
  12. <gradient  
  13.         android:angle="integer"  
  14.         android:centerX="integer"  
  15.         android:centerY="integer"  
  16.         android:centerColor="integer"  
  17.         android:endColor="color"              
  18.         android:gradientRadius="integer"  
  19.         android:startColor="color"  
  20.         android:type=["linear"|"radial"|"sweep"]  
  21.         android:usesLevel=["true"|"false"]/>  
  22.   <!-- 定义几何形状的内边框 -->   
  23. <padding  
  24.         android:left="integer"  
  25.         android:top="integer"  
  26.         android:right="integer"  
  27.         android:bottom="integer"/>  
  28. <!-- 定义几何形状的大小 -->   
  29. <corners  
  30.         android:width="integer"  
  31.         android:color="color"  
  32.         android:dashWidth="integer"  
  33.         android:dashGap="integer"/>  
  34.    <!-- 定义使用单种颜色填充 -->   
  35. <solid  
  36.     android:color="color"/>  
  37. <!-- 定义几何形状绘制边框 -->   
  38. <stroke  
  39.     android:width="integer"  
  40.     android:color="color"  
  41.     android:dashWidth="integer"  
  42.     android:dashGap="integer"/>  
  43. </shape>  

4.ClipDrawable资源

    ClipDrawable代表从其他位图上截取的一个"图片片段"。在XML文件中定义ClipDrawable对象使用<clip../>元素,该元素具有以下属性:
    >android:drawable:指定截取的源Drawable对象
    >android:clipOrientation:指定截取方向,可设置水平截取或垂直截取
    >android:gravity:指定截取时的对齐方式
该元素的语法为:
  1. <? xml version="1.0" encoding="utf-8"?>  
  2. <clip xmlns:android="http://schemas.android.com/apk/res/android"  
  3.         android:drawable="@drawable/drawable_resource"  
  4.         android:clipOritentation=["horizontal"|"vertical"]  
  5.         android:gravity=["top"|....]> 
注:使用ClipDrawable对象对可调用setLevel(int level)方法来设置截取的区域大小,当level为0时,截取的图片片段为空;当level为10000时,截取整张图片。

5.AnimationDrawable资源(/res/anmi)


    AnimationDrawable代表一个动画,Android支持传统的逐帧动画(类似于电影方式,即一张图片一张图片地切换)和补间动画(通过平移、变化计算得到)。
(1)定义补间动画的思路是
    置一张图片的开始状态(包括透明度、位置、缩放比、旋转度),然后,设置该图片的结束状态(包括透明度、位置、缩放比、旋转度),在设置动画的持续时间,Android系统会使用动画效果把这张图片从开始状态变换到结束状态。在XML资源文件中以<set../>元素作为根元素,该元素的属性有:
    >android:interpolator="@anim/interpolator_resource" 作用:指定指定动画的变化速度
    >android:shareInterpolator=["true"|"false"]    作用:指定<set../>元素下所有的变换效果使用相同的动画速度
    >android:duration="integer(持续的时间)"       作用:设置动画的持续时间
根元素包含如下4个子元素:
    ◇<alpha.../>:设置透明度的改变  
    ◇<scale.../>:设置图片进行缩放改变
    ◇<translate.../>:设置图片进行位移变换
    ◇ <rotate.../>:设置图片进行旋转
注:除<set.../>根元素外,<alpha.../>、<scale.../>等子元素都可以指定一个android:interpolator属性,通过该属性可以指定动画的变化速度,如匀速、正加速、负加速、无规则变速等,Android系统的R.anim类就包含大量的常量来定义这些速度,如linear_interpolator(匀速变换)、accelerate_interpolator(加速变换)、decelerate_interpolator(减速变换)。
(2)设置补间动画的语法格式
  1. <? xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  3.         android:interpolator="@anim/interpolator_resource"  
  4.         android:shareInterpolator=["true"|"false"]  
  5.         android:duration="integer(持续的时间)">  
  6.         <!--设置透明度的改变-->  
  7.         <alpha  
  8.                 android:fromAlpha="float"  
  9.                 android:toAlpha="float"/>  
  10.         <!--设置图片进行缩放改变-->  
  11.         <scale  
  12.                 android:fromXScale="float"  
  13.                 android:toXScale="float"  
  14.                 android:fromYScale="float"  
  15.                 andrroid:toYScale="float"  
  16.                 android:pivotX="float"  
  17.                 android:pivotY="float"/>  
  18.         <!--设置图片进行位移改变-->  
  19.         <translate  
  20.                 android:fromXDelta="float"  
  21.                 android:toXDelta="float"  
  22.                 android:fromYDelta="float"  
  23.                 android:toYDelta="float"/>       
  24.       <!--设置图片进行旋转改变-->  
  25.         <rotate  
  26.                 android:fromDegress="float"  
  27.                 android:toDegress="float"  
  28.                 android:pivotX="float"  
  29.                 android:pivotY="float"/>  
  30. </set> 
注释:上面语法格式中包含了大量的fromXxx,toXxxx属性,用于定义图片的开始状态和结束状态。另外,当进行缩放变换(scale)、旋转(rotate)变换时,还需要指定pivotX、pivotY两个属性,用于指定变换的"中心点"("旋转轴")。
源码实战:自定义Activity切换风格
(1)res/values/activityTheme.xml
功能:自定义Activity窗口显示风格,并通过android:windowAnimationStyle属性设置Activity进入与退出的切换风格,其中@anim/zoom_enter和@anim/zoom_exit分别代表的是进入动画和退出动画。
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="mTheme"  parent="android:style/Theme.NoTitleBar">
         <item name="android:windowNoTitle">true</item>
         <item name="android:windowFullscreen">false</item>
         <item name="android:windowIsTranslucent">true</item>
         <item name="android:windowAnimationStyle">@style/activity_bottom_in_top_out</item>
         <item name="android:windowSoftInputMode">stateHidden</item>
    </style>    
    <style name="activity_bottom_in_top_out" parent="@android:style/Animation.Translucent">
              <item name="android:windowEnterAnimation">@anim/zoom_enter</item>
              <item name="android:windowExitAnimation">@anim/zoom_exit</item>
    </style>
</resources>
(2)res/anim/zoom_enter.xml
功能:Activity进入动画效果
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator" >
    <scale
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXScale="2.0"
        android:fromYScale="2.0"
        android:pivotX="50%p"
        android:pivotY="50%p"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>
(3)res/anim/zoom_exit.xml
功能:Activity退出动画效果
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromYDelta="0"
        android:toYDelta="100%" />
    <alpha
        android:duration="1000"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>
(4)AndroidManifest.xml
功能:在清单文件中通过Android:theme属性指定应用或单个Activity的主题,即应用切换效果。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="suntektech.project.spq"
    android:versionCode="1"
    android:versionName="1.0" >
    <!-- 添加写sd卡的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 添加访问网络权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    <!-- 设置应用支持的设备尺寸 -->
<supports-screens 
    android:smallScreens="false"
    android:normalScreens="true"
    android:largeScreens="true"
    android:xlargeScreens="false"/>
    <!-- android:screenOrientation="portrait"禁止横屏 -->
    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
       android:theme="@style/mTheme"
        android:label="@string/app_name">
        <activity
            android:name="suntektech.project.spq.WelcomeActivity"
            android:label="@string/app_name" 
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
(5)效果演示



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值