轉載請標明出處: http://blog.csdn.net/Airsaid/article/details/51591282
本文出自:周遊的博客
前言
上一篇寫了補間動畫的使用,由於篇幅原因,就把自定義補間動畫單獨拿出來了。這一篇繼續寫補間動畫~
在上一篇中寫到了Android提供了Animation類作爲補間動畫的抽象基類,並提供了四個子類:ScaleAnimation 、TranslateAnimation、AlphaAnimation、RotateAnimation分別實現了四種基本動畫形式:縮放改變、位置改變、透明度改變和旋轉改變。
但是我們在實際項目開發中,也有可能遇到更復雜的動畫形式。比如說:三維旋轉等。那麼這個時候Android自己提供的就不能滿足我們的需求了。我們需要自己來定義一個補間動畫。
其實自定義補間動畫並不難,我們只需要繼承Animation抽象類,繼承Animation類的關鍵是要重寫該抽象類的applyTransformation(float interpolatedTime, Transformation t)方法,該方法中的兩個參數說明如下:
interpolatedTime:代表了動畫的時間進行比。不管動畫實際的持續時間如何,當動畫播放時,該參數總是自動從0變化到1。
Transformation :代表了補間動畫在不同時刻對圖形或組件的變形程度。
從上面的介紹可以看出,實現自定義補間動畫的重點就在於重寫applyTransformation方法時根據interpolatedTime時間來動態的計算動畫對圖形的變形程度。
Transformation代表了對圖片或視圖的變形程度,該對象裏封裝了一個Matrix對象,對它所包裝的Matrix對象進行旋轉、位置、傾斜等變換時,Transformation將會控制所對於的圖片或者視圖進行相應的變換。
下面以一個自定義三維旋轉的補間動畫爲例,演示下自定義補間動畫的使用。
使用
首先需要介紹一個類:Camera。這個Camera並非代表手機的攝像頭,而是一個空間變換工具,作用有點類似於Matrix,但是比Matrix更加強大。
Camera提供瞭如下常用方法:
* getMatrix(Matrix matrix):將Camera所做的變換應用到指定的Matrix上。
* rotateX(float deg):使目標組件沿X軸旋轉。
* rotateY(float deg):使目標組件沿Y軸旋轉。
* rotateZ(float deg):使目標組件沿Z軸旋轉。
* translate(float x, float y, float z):使目標組件在三維空間裏進行位移變換。
* applyToCanvas(Canvas canvas):把Camera所做的變換應用到Canvas上。
下面的程序裏利用Camera來自定義在三維空間的動畫,該程序的自定義動畫類代碼如下:
/**
* 作者:周遊
* 時間:2016/06/05 13:03
* 描述:自定義補間動畫演示(三維旋轉動畫)
*/
public class CustomTweenAnimation extends Animation {
private float mCenterX;
private float mCenterY;
private int mDuration;
private Camera mCamera = new Camera();
public CustomTweenAnimation(float x, float y, int duration) {
this.mCenterX = x;
this.mCenterY = y;
this.mDuration = duration;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
// 設置動畫持續時間
setDuration(mDuration);
// 設置動畫結束後效果保留
setFillAfter(true);
// 設置勻速變換
setInterpolator(new LinearInterpolator());
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
mCamera.save();
// 根據interpolatedTime時間來控制x、y、z軸上的偏移
mCamera.translate(100.0f - 100.0f * interpolatedTime, 150.0f * interpolatedTime - 150
, 80.0f - 80.0f * interpolatedTime);
// 設置根據interpolatedTime時間在x軸上旋轉不同角度
mCamera.rotateX(360 * interpolatedTime);
// 設置根據interpolatedTime時間在y軸上旋轉不同角度
mCamera.rotateY(360 * interpolatedTime);
// 獲取Transformation參數的Matrix對象
Matrix matrix = t.getMatrix();
// 將Camera所做的變換應用到Transformation的Matrix上
mCamera.getMatrix(matrix);
matrix.preTranslate(-mCenterX, -mCenterY);
matrix.postTranslate(mCenterX, mCenterY);
mCamera.restore();
}
}
啓動動畫:
CustomTweenAnimation customTweenAnimation = new CustomTweenAnimation(50, 50, 5000);
mTextView.startAnimation(customTweenAnimation);
運行結果: