android 补间(Tween)动画

 如果动画中的图像变换的比较有规律时,可能采用自动生图中间图像的方式来生成动画,例如图像的移动、旋转、缩放等。补间动画的优点是可以节省空间。

一、移动补间动画

可以通过配置动画文件(xml文件)或java代码来实现补间动画的移动效果。补间动画文件需要放在res\anim目录下。假设在res\anim目录下有一个动画文件test.xml,该文件内容如下:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator" android:fromXDelta="-320"
android:toXDelta="320" android:fromYDelta="0" android:toYDelta="0"
android:duration="5000" />

1,android:interpolator:表示动画渲染器。

accelerate_interpolator动画加速器。动画在开始时最慢,然后逐渐加速。

decelerate_interpolator动画减速器。动画在开始时最快,然后逐渐减速。

accelerate_decelerate_interpolator动画加减速器。动画在开始和结束时速度最慢,但在前半部分时开始加速,在后半部分时开始减速。

2,android:fromXDelta 动画起始位置的X坐标。

android:toXDelta 动画结束位置的X坐标。

android:fromYDelta 动画起始位置的Y坐标。

android:toYDelta 动画结束位置的Y坐标。

android:duration 动画的持续时间,单位是毫秒。

装载补间动画

装载补间动画文件需要使用AnimationUtils.loadAnimation方法。

装载text.xml文件的代码如下:

Animation animation = AnimationUtils.loadAnimation(this, R.anim.test);

animation.setRepeatCount(Animation.INFINITE);//循环显示。

应用补间动画

假设有一个EditText组件(editText),将test.xml文件中设置的补间动画应用到EditText组件上的方式有两种:

(1) 使用EditText类的startAnimation方法:

editText.startAnimation(animation);

(2)使用Animation类的start方法:

//绑定补间动画

editText.setAnimation(animation);

//开始动画

animation.start();

如果想在该动画结束后运行别的动画或者别的操作,那么需要在AnimationListener接口的onAnimationEnd方法中完成。下面的例子就是在炮弹动画运行结束后,将其隐藏,然后再播放炸弹效果的动画和声音:

public void onAnimationEnd(Animation animation) {
//在投放炸弹动画结束之后。。。。
ivBlast.setVisibility(View.VISIBLE);
ivMissile.setVisibility(View.INVISIBLE);
try {
//开始播放爆炸的声音
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.bomb);
mediaPlayer.stop();
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}

下面的例子是,小球落到地面后又弹起的动画:

public void onAnimationEnd(Animation animation) {
if(animation.hashCode() == animationBottom.hashCode()){
imageView.startAnimation(animationTop);
}else if(animation.hashCode() == animationTop.hashCode()){
imageView.startAnimation(animationBottom);
}
}

animationDrawable.stop();
animationDrawable.start();
}

二、缩放补间动画

<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromXScale="0.0" android:toXScale="1.0" android:fromYScale="0.0"
android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:duration="5000">
</scale>

android:pivotX 表示沿X轴方向缩放的支点位置。

android:pivotY 表示沿Y轴方向缩放的支点位置。

都为50%时,表示支点在中心位置。

三、旋转补间动画

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@animnear_interpolator" android:fromDegrees="0"

android:toDegrees="360" android:pivotX="50%" android:pivotY="50%"

android:duration="1000" android:repeatMode="restart" android:repeatCount="infinite"/>

android:repeatCount 设置旋转的次数,值为-1或者infinite时,表示补间动画永不停止。0表示一次。

android:repeatMode 设置重复的模式。默认是restart。当repeatCount的值大于0或者为infinite时才有效。

还可以设成reverse,表示偶数次显示动画时会做与动画文件定义的方向相反的方向动行。

四、透明补间动画

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.1" android:duration="2000" />

五、多种补间动画一起应用

<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.1" android:duration="2000" />
<translate android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="0"
android:toYDelta="-380" android:duration="2000" />
<scale android:interpolator="@android:anim/accelerate_interpolator"
android:fromXScale="1.0" android:toXScale="0.2" android:fromYScale="1.0"
android:toYScale="0.2" android:pivotX="50%" android:pivotY="50%"
android:duration="2000" />
<t>
set标签中定义的动画会在同一时间开始运行。。。

六、振动效果

cycle_interpolator是振动动画渲染器。由于该渲染器未在系统中定义,需要自己编写cycle_interpolator.xml文件,并将该文件放在res\anim目录中。内容如下:

<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="18" />

android:cycles 表示振动因子。值越大,振动的越剧烈。

下面来创建一个动画文件shake.xml。如下:
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0" android:toXDelta="10"
android:fromYDelta="0" android:toYDelta="0" android:duration="3000"
android:interpolator="@animcle_interpolator" />

开始振动效果的代码如下:

animation = AnimationUtils.loadAnimation(this, R.anim.shake);

imageView = (ImageView) findViewById(R.id.shake_image);

imageView.startAnimation(animation);
posted @ 2012-02-27 13:20  OYK  阅读(2042)  评论(0编辑  收藏  举报