創建自定義動畫非常簡單,只要實現他的applyTransformation的邏輯就可以了,不過通常情況下還要覆蓋父類的initialize方法來實現一些初始化工作。
模擬電視機關閉效果動畫
import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;
public class CustomTV extends Animation {
private int mCenterWidth;
private int mCenterHeight;
private Camera mCamera = new Camera();
private float mRotateY = 0.0f;
@Override
public void initialize(int width,
int height,
int parentWidth,
int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
// 設置默認時長
setDuration(1000);
// 動畫結束後保留狀態
setFillAfter(true);
// 設置默認插值器
setInterpolator(new AccelerateInterpolator());
mCenterWidth = width / 2;
mCenterHeight = height / 2;
}
// 暴露接口-設置旋轉角度
public void setRotateY(float rorateY) {
mRotateY = rorateY;
}
@Override
protected void applyTransformation(
float interpolatedTime,
Transformation t) {
final Matrix matrix = t.getMatrix();
matrix.preScale(1,
1 - interpolatedTime,
mCenterWidth,
mCenterHeight);
}
}
關於Interpolator 時間插值類,定義動畫變換的速度。能夠實現alpha/scale/translate/rotate動畫的加速、減速和重複等。Interpolator類其實是一個空接口,繼承自TimeInterpolator,TimeInterpolator時間插值器允許動畫進行非線性運動變換,如加速和限速等,該接口中只有接口中有一個方法 float getInterpolation(float input)這個方法。傳入的值是一個0.0~1.0的值,返回值可以小於0.0也可以大於1.0。
AccelerateDecelerateInterpolator 動畫開始與結束的地方速率改變比較慢,在中間的時候加速。
AccelerateInterpolator 動畫開始的地方速率改變比較慢,然後開始加速。
AnticipateInterpolator 開始的時候向後然後向前甩。
AnticipateOvershootInterpolator 開始的時候向後然後向前甩一定值後返回最後的值。
BounceInterpolator 動畫結束的時候彈起。
CycleInterpolator 動畫循環播放特定的次數,速率改變沿着正弦曲線。
DecelerateInterpolator 在動畫開始的地方快然後慢。
LinearInterpolator 以常量速率改變。
OvershootInterpolator 向前甩一定值後再回到原來位置。
PathInterpolator 新增的,就是可以定義路徑座標,然後可以按照路徑座標來跑動;注意其座標並不是 XY,而是單方向,也就是我可以從0~1,然後彈回0.5 然後又彈到0.7 有到0.3,直到最後時間結束。