Android 动画之Animation篇

 

     Android的Animation是一种提供2D动画效果的类,在应用开发中会经常用到,以此来提高用户的体验性能。根据Android SDK 提供的内容,Animation共分两种:tweened animation(渐变动画) frame-by-frame animation(画面转换动画)。

一、        Tweened Animation

在渐变动画中可有四种分类,如下表:

名称

XML

JAVA

渐变透明度

<alpha></alpha>

AlphaAnimation

渐变尺寸

<scale></scale>

ScaleAnimation

画面位置转换

<translate></translate>

TranslateAnimation

画面旋转

<rotate></rotate>

RotateAnimation

注:AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation继承于Animation

 

Tween Animation共同的节点属性

属性[类型]

功能

备注

Duration[long]

属性为动画持续时间

时间以毫秒为单位

fillAfter   [boolean]

当设置为true   ,该动画转化在动画结束后被应用

fillBefore[boolean]

当设置为true   ,该动画转化在动画开始前被应用

interpolator

指定一个动画的插入器

有一些常见的插入器
  accelerate_decelerate_interpolator
  加速-减速 动画插入器
  accelerate_interpolator
  加速-动画插入器
  decelerate_interpolator
  减速- 动画插入器
  其他的属于特定的动画效果

repeatCount[int]

动画的重复次数

 

RepeatMode[int]

定义重复的行为

1:restart   重新开始

2:reverse   回退

startOffset[long]

动画之间的时间间隔,从上次动画停多少时间开始执行下个动画

zAdjustment[int]

定义动画的Z   Order的改变

0:保持Z   Order不变
  1:保持在最上层
  -1:保持在最下层

 

1、         XML文件中定义

在res下建立文件夹anim。所有的动画xml文件都要放在anim里。以下是关于4种类型动画在XML中节点说明:

 

 

XML节点

功能说明

 

alpha

渐变透明度动画效果

<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”1000″ />

fromAlpha

属性为动画起始时透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字

duration为动画持续时间,ms单位

toAlpha

属性为动画结束时透明度

 

scale

渐变尺寸伸缩动画效果

<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.0″
android:fromYScale=”0.0″
android:toYScale=”1.5″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“500”
android:duration=”1000″
android:repeatCount=”10″ />

fromXScale[float] fromYScale[float]

为动画起始时,X、Y坐标上的伸缩尺寸

0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示

toXScale [float]
toYScale[float]

为动画结束时,X、Y坐标上的伸缩尺寸

pivotX[float]
pivotY[float]

为动画相对于物件的X、Y坐标的开始位置

属性值说明:50%为物件的X或Y方向坐标上的中点位置,相对于自身。”50“代表绝对位置,“50%p”这代表相对于父控件来说。

 

translate

画面转换位置移动动画效果

<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />

fromXDelta
toXDelta

为动画、结束起始时 X坐标上的位置

以自身中心为坐标原点,数值为正则

向正方向,反之为负方向。

fromYDelta
toYDelta

为动画、结束起始时 Y坐标上的位置

以自身中心为坐标原点,数值为正则

向正方向,反之为负方向。当不设时或者数值为0%时为自身位置。

 

rotate

画面转移旋转动画效果

<rotate
  android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
  android:fromDegrees=”0″
  android:toDegrees=”+350″
  android:pivotX=”50%”
  android:pivotY=”50%”
  android:duration=”3000″ />

fromDegrees

为动画起始时物件的角度

说明
  当角度为负数——表示逆时针旋转
  当角度为正数——表示顺时针旋转
  (负数from——to正数:顺时针旋转)
  (负数from——to负数:逆时针旋转)
  (正数from——to正数:顺时针旋转)
  (正数from——to负数:逆时针旋转)

toDegrees

属性为动画结束时物件旋转的角度 可以大于360度

pivotX
  pivotY

为动画相对于物件的X、Y坐标的开始位

属性值说明:50%为物件的X或Y方向坐标上的中点位置,相对于自身。”50“代表绝对位置,“50%p”这代表相对于父控件来说。

 

这4类动画的定义都必须放在<set></set>节点里,并且可以一起使用,如下:

 1 <set xmlns:android="http://schemas.android.com/apk/res/android"
 2 
 3     android:interpolator="@android:anim/linear_interpolator"
 4 
 5     android:shareInterpolator="true">
 6 
 7     <!-- 淡入淡出 -->
 8 
 9     <alpha
10 
11         android:fromAlpha="1.0"
12 
13         android:toAlpha="0.5"
14 
15         android:duration="1500"
16 
17         android:repeatCount="infinite"
18 
19         android:repeatMode="reverse" />
20 
21  
22 
23     <!-- 公传360度 -->
24 
25     <rotate
26 
27         android:fromDegrees="0"
28 
29         android:toDegrees="+360"
30 
31         android:pivotX="50%"
32 
33         android:pivotY="50%"
34 
35         android:duration="3000"
36 
37         android:repeatCount="infinite"
38 
39         android:repeatMode="restart" />
40 
41 </set>

 

 

动画xml文件定义完后,在Activity中调用,方法如下:

Animation anim=AnimationUtils.loadAnimation(MyActivity.this, R.anim.alpha_anim); img.setAnimation(anim);

AnimationUtils为android加载并解析动画定义的一个类。MyActivity.this为当前Activity类的上下文。R.anim.alpha_anim为引用anim文件夹里定义的名叫alpha_anim.xml的动画定义文件。imageView为想要为之添加动画的图片。

2、         JAVA代码中定义

下面一段代码为在java中定义四类动画:

 

 1 //在代码中定义 动画实例对象
 2 
 3 private Animation myAnimation_Alpha;
 4 
 5 private Animation myAnimation_Scale;
 6 
 7 private Animation myAnimation_Translate;
 8 
 9 private Animation myAnimation_Rotate;
10 
11 //根据各自的构造方法来初始化一个实例对象
12 
13 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
14 
15 myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
16 
17 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
18 
19 myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
20 
21 myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
22 
23 Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

 

AlphaAnimation
① AlphaAnimation类对象定义

 private AlphaAnimation myAnimation_Alpha;

② AlphaAnimation类对象构造

AlphaAnimation(float fromAlpha, float toAlpha)

//第一个参数fromAlpha为 动画开始时候透明度

//第二个参数toAlpha为 动画结束时候透明度

myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);

//说明:

// 0.0表示完全透明

// 1.0表示完全不透明

③ 设置动画持续时间

myAnimation_Alpha.setDuration(5000);

//设置时间持续时间为 5000毫秒

ScaleAnimation

 

① ScaleAnimation类对象定义

private AlphaAnimation myAnimation_Alpha;

② ScaleAnimation类对象构造

ScaleAnimation(float fromX, float toX, float fromY, float toY,

int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

 

//第一个参数fromX为动画起始时 X坐标上的伸缩尺寸

//第二个参数toX为动画结束时 X坐标上的伸缩尺寸

//第三个参数fromY为动画起始时Y坐标上的伸缩尺寸

//第四个参数toY为动画结束时Y坐标上的伸缩尺寸

/*说明:

以上四种属性值

0.0表示收缩到没有

1.0表示正常无伸缩

值小于1.0表示收缩

值大于1.0表示放大

*/

//第五个参数pivotXType为动画在X轴相对于物件位置类型

//第六个参数pivotXValue为动画相对于物件的X坐标的开始位置

//第七个参数pivotXType为动画在Y轴相对于物件位置类型

//第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置

myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,

Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

③ 设置动画持续时间

myAnimation_Scale.setDuration(700);

TranslateAnimation

 

① TranslateAnimation类对象定义

private AlphaAnimation myAnimation_Alpha;

② TranslateAnimation类对象构造

TranslateAnimation(float fromXDelta, float toXDelta,

float fromYDelta, float toYDelta)

//第一个参数fromXDelta为动画起始时 X坐标上的移动位置

//第二个参数toXDelta为动画结束时 X坐标上的移动位置

//第三个参数fromYDelta为动画起始时Y坐标上的移动位置

//第四个参数toYDelta为动画结束时Y坐标上的移动位置

③ 设置动画持续时间

myAnimation_Translate.setDuration(2000);

//设置时间持续时间为 2000毫秒

④设置动画变化应用时机

//动画结束后状态应用

myAnimation_Translate.setFillAfter(true);

 

//动画开始前状态应用

myAnimation_Translate.setFillBefore(false);

 

RotateAnimation

 

① RotateAnimation类对象定义

private AlphaAnimation myAnimation_Alpha;

② RotateAnimation类对象构造

RotateAnimation(float fromDegrees, float toDegrees,

int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

//第一个参数fromDegrees为动画起始时的旋转角度

//第二个参数toDegrees为动画旋转到的角度

//第三个参数pivotXType为动画在X轴相对于物件位置类型

//第四个参数pivotXValue为动画相对于物件的X坐标的开始位置

//第五个参数pivotXType为动画在Y轴相对于物件位置类型

//第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置

myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,

Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

③ 设置动画持续时间

myAnimation_Rotate.setDuration(3000);

//设置时间持续时间为 3000毫秒

 

在放缩,旋转,移动的过程中,有三种参数,Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, Animation.RELATIVE_TO_PARENT分别代表的是绝对位置,相对于自身的位置,相对于父控件的位置。

 

二、        Frame-by-frame Animation

Frame Animation 是顺序播放预先做好的图片,通过人的视觉误差来实现动画效果,跟电影原理类似。一般的用法是,我们用这些有播放规律的一系列图片来制作成一个frame-by-frame animation的xml文件,然后把它作为某个View 的背景图片,再执行播放效果。

Frame Animation可以在XML Resource定义(还是存放到res\anim文件夹下),也可以使用AnimationDrawable中的API定义。由于Tween Animation与Frame Animation有着很大的不同,因此XML定义的格式也完全不一样,其格式是:首先是animation-list根节点,animation-list根节点中包含多个item子节点,每个item节点定义一帧动画,当前帧的drawable资源和当前帧持续的时间。下面对节点的元素加以说明:

XML属性

说明

drawable

当前帧引用的drawable资源

duration

当前帧显示的时间(毫秒为单位)

oneshot

如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。

variablePadding

如果为true,可以根据当前选中的状态来改变drawable的padding

visible

规定drawable的初始可见性,默认为flase;

 

 

下面是官方文档提供的xml代码:

<!-- Animation frames are wheel0.png -- wheel5.png files inside the
 res/drawable/ folder -->
 <animation-list android:id="selected" android:oneshot="false">
    <item android:drawable="@drawable/wheel0" android:duration="50" />
    <item android:drawable="@drawable/wheel1" android:duration="50" />
    <item android:drawable="@drawable/wheel2" android:duration="50" />
    <item android:drawable="@drawable/wheel3" android:duration="50" />
    <item android:drawable="@drawable/wheel4" android:duration="50" />
    <item android:drawable="@drawable/wheel5" android:duration="50" />
 </animation-list>

 

其中whell0~whell5是要播放的一系列图片,下面是在Activity里调用:

 1  
 2 
 3 package cn.yj3g.AnimationsAPI;
 4 
 5  
 6 
 7 import android.app.Activity;
 8 
 9 import android.graphics.drawable.AnimationDrawable;
10 
11 import android.os.Bundle;
12 
13 import android.view.View;
14 
15 import android.view.View.OnClickListener;
16 
17 import android.widget.Button;
18 
19 import android.widget.ImageView;
20 
21  
22 
23 public class AnimationsAPIActivity3 extends Activity implements OnClickListener {
24 
25     private ImageView imageView;
26 
27     private Button moveButton;
28 
29  
30 
31     @Override
32 
33     public void onCreate(Bundle savedInstanceState) {
34 
35         super.onCreate(savedInstanceState);
36 
37         setContentView(R.layout.framebyframe);
38 
39         // 找到布局文件中的控件
40 
41         imageView = (ImageView) findViewById(R.id.iv_imagemove);
42 
43         moveButton = (Button) findViewById(R.id.move);
44 
45         moveButton.setOnClickListener(this);
46 
47     }
48 
49  
50 
51     @Override
52 
53     public void onClick(View v) {
54 
55         //得到配置文件中的背景文件
56 
57         imageView.setBackgroundResource(R.drawable.anim_nv);
58 
59         AnimationDrawable animationDrawable = (AnimationDrawable) imageView
60 
61                 .getBackground();
62 
63         animationDrawable.start();
64 
65     }
66 
67 }

 

这里注意一点是,不能在Acitity的onCreate方法里启动动画,否则你只能看到第一张图片,而没有动画效果。因为onCreate中AnimationDrawable还没有与window关联。

posted @ 2012-04-12 14:35  chiboo  阅读(1266)  评论(0编辑  收藏  举报