如果動畫中的映像變換的比較有規律時,可能採用自動生圖中間映像的方式來產生動畫,例像的移動、旋轉、縮放等。補間動畫的優點是可以節省空間的。
一、移動補間動畫
可以通過配置動畫檔案(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);