逐幀動畫
定義如下(在anim目錄下定義一個xml文件):
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/flower1" android:duration="1000"/>
<item android:drawable="@drawable/flower2" android:duration="1000" />
</animation-list>
android:oneshot控制動畫是否重複播放,如果爲true就不重複。
具體用法如下:
1、在xml佈局中設置ImageView的背景爲動畫(anim/xx.xml) 或者用代碼:myView.setBackgroundResource(+R.anim.xx);(注意R前面的"+"號,如果沒有可能會報錯)
2.AnimationDrawable anima = (AnimationDrawable)imageView.getBackground();
3.anima.start(); //stop()是停止
補間動畫
android使用Animation抽象類來定義動畫,他有下面幾個子類:TranslateAnimation AlphaAnimation RotateAnimation ScaleAnimation。 只要爲補間動畫定義了三個必要的信息,android就會根據開始幀,結束幀,持續時間計算出中間還需要補入多少幀,並計算所有補入幀的圖形。爲了計算動畫期間需要補入多少幀以及具體什麼時間補幀,android引入了Interpolator配合補間動畫,用來控制動畫速度,這樣就可以使動畫以勻速,變速,拋物線速度等速度進行展示。
Interpolator是一個接口,常見的有如下幾個實現類,分別實現不同的動畫變換速度。 AccelerateInterpolator :開始較慢,後面加速。 AccelerateDecelerateInterpolator ;開始和結束較慢,中間加速。 CycleInterpolator :變換速度按正玄曲線。 DecelerateInterpolator 開始較快,然後開始減速。 LinearInterpolator :動畫勻速變換。 一般都會使用資源文件來定義補間動畫,這些定義可以寫在資源文件中的android:interpolator屬性裏面,就像下面這樣:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<scale android:fromXScale="1.0"
android:toXScale="0.01"
android:fromYScale="1.0"
android:toYScale="0.01"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="true"
android:duration="3000" />
<alpha android:fromAlpha="1.0"
android:toAlpha="0.05"
android:duration="3000" />
<rotate android:fromDegrees="0"
android:toDegrees="1800"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000" />
</set>
補間動畫的大致用法如下:1、在資源文件中定義補間動畫;
2、加載動畫 Animation anim = AnimationUtils.loadAnimation(this, R.anim.xxx);
animation.setFillAfter(true);
或者在代碼裏面寫:
TranslateAnimation anim = new TranslateAnimation(curX,nextX,curY,nextY);
anim.setDuration(time);3、開啓動畫 imgview.startAnimation(anim);
自定義補間動畫
自定義補間動畫可以實現3D的效果,需要繼承Animation並重寫applyTransformation(float interpolatedTime, Transformation t)方法,這個兩個參數說明如下:
interpolatedTime:代表了動畫的時間進行比,值的範圍是0~1.
Transformation:代表不同時刻對動畫的變形程度,裏面包裝了Matrix(用getMatrix()即可得到),因此可以進行旋轉,縮放,移動等操作。
爲了對圖像或視圖進行三維空間變換還需要使用到Camera類,作用類似於Matrix,但更加強大,其提供瞭如下常用的方法:
save():
restore():
getMatrix(Matrix matrix):將Camera所做的變換應用到matrix上
camera.translate(float x, float y, float z):在三維空間進行位移變換
rotateX(float deg):沿着x軸旋轉
rotateY(float deg):
rotateZ(float deg):
applyToCanvas(Canvas canvas):將Camera所做的變換應用到canvas上
android三維座標系統如下圖:
實現自定義補間動畫的關鍵調用如下:
1、在繼承Animation的類中
public MyAnimation(int x,int y,int d)
{
cX =x;
cY = y;
duration = d;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
setDuration(duration);
setFillAfter(true); //設置動畫結束後效果保留
setInterpolator(new LinearInterpolator());
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
camera.save();
camera.translate(100 - 100 * interpolatedTime, 150 * interpolatedTime - 150, 80 - 80 * interpolatedTime);
camera.rotateX(720 * interpolatedTime);
camera.rotateZ(720 * interpolatedTime);
Matrix matrix = t.getMatrix();
camera.getMatrix(matrix);
matrix.preTranslate(-cX, -cY);
matrix.postTranslate(cX, cY);
camera.restore();
}
2、在MainActivity中啓動該動畫即可 listView.setAnimation(new MyAnimation(screenWidth / 2, screenHeight / 2, 7000));