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);
一、移动补间动画
可以通过配置动画文件(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);