在代碼中繼承android.view.animation.Animation類來實現自定義效果。通過重寫Animation的applyTransformation(float interpolatedTime, Transformation t)函數來實現自定義動畫效果。
在繪制動畫的過程中會反復的調用applyTransformation函數,每次調用參數interpolatedTime值都會變化,該參數從0漸 變為1,當該參數為1時表明動畫結束。通過參數Transformation 來獲取變換的矩陣(matrix),通過改變矩陣就可以實現各種復雜的效果。
自定義圖片旋轉效果動畫代碼。
class ViewAnimation extends Animation
{
int mCenterX;
int mCenterY;
Camera camera = new Camera();
public ViewAnimation()
{
}
@Override
public void initialize(int width, int height, int parentWidth,
int parentHeight)
{
super.initialize(width, height, parentWidth, parentHeight);
mCenterX = width/2;
mCenterY = height/2;
setDuration(2500);
setFillAfter(true);
// setRepeatCount(100);
setInterpolator(new LinearInterpolator());
}
@Override
protected void applyTransformation(float interpolatedTime,
Transformation t)
{
final Matrix matrix = t.getMatrix();
camera.save();
camera.translate(0.0f, 0.0f, (1300 - 1300.0f * interpolatedTime));
camera.rotateY(360 * interpolatedTime);
camera.getMatrix(matrix);
matrix.preTranslate(-mCenterX, -mCenterY);
matrix.postTranslate(mCenterX, mCenterY);
camera.restore();
}
}
camera.translate(0.0f, 0.0f, (1300 - 1300.0f * interpolatedTime))在第一次調用的時候interpolatedTime值為0,相當於把ImageView在Z軸后移1300像素, 然后逐步的往前移動到0,同時camera.rotateY(360 * interpolatedTime)函數又把ImageView沿Y軸翻轉360度
Android中並沒有提供直接做3D翻轉的動畫,所以關於3D翻轉的動畫效果需要我們自己實現,那么我們首先來分析一下Animation 和 Transformation。
Animation動畫的主要接口,其中主要定義了動畫的一些屬性比如開始時間,持續時間,是否重復播放等等。而Transformation中則包含一個矩陣和alpha值,矩陣是用來做平移,旋轉和縮放動畫的,而alpha值是用來做alpha動畫的,要實現3D旋轉動畫我們需要繼承自Animation類來實現,我們需要重載getTransformation和applyTransformation,在getTransformation中Animation會根據動畫的屬性來產生一系列的差值點,然后將這些差值點傳給applyTransformation,這個函數將根據這些點來生成不同的Transformation。
其中包括了旋轉的開始和結束角度,中心點、是否扭曲、和一個Camera,這里我們主要分析applyTransformation函數,其中第一個參數就是通過getTransformation函數傳遞的差指點,然后我們根據這個差值通過線性差值算法計算出一個中間角度degrees,Camera類是用來實現繞Y軸旋轉后透視投影的,因此我們首先通過t.getMatrix()取得當前的矩陣,然后通過camera.translate來對矩陣進行平移變換操作,camera.rotateY進行旋轉。這樣我們就可以很輕松的實現3D旋轉效果了
見過沒有用opengl的3D動畫,看了一下,是用的Camera實現的,內部機制實際上還是opengl,不過大大簡化了使用。
Camera就像一個攝像機,一個物體在原地不動,然后我們帶着這個攝像機四處移動,在攝像機里面呈現出來的畫面,就會有立體感,就可以從各個角度觀看這個物體。
它有旋轉、平移的一系列方法,實際上都是在改變一個Matrix對象,一系列操作完畢之后,我們得到這個Matrix,然后畫我們的物體,就可以了。
常用的API如下:
rotateX(float degree) 繞着x軸旋轉degree個度數
rotateY(float degree) 繞着y軸旋轉degree個度數
rotateZ(float degree) 繞着z軸旋轉degree個度數
translate(float x,float y,float z) 平移一段距離
save()和restore() 作用跟Canvas的一樣,保存原狀態,操作完之后,恢復到原狀態。
Android 電視關閉的動畫效果
最近研究android的Animation 做了幾個小動畫 分享給大家~
先看效果圖~


首先創建一個TVOffAnimation繼承於Animation,這個類是專門做動畫效果的~不用多說了吧~
2 int parentHeight) {
3
4 super .initialize(width, height, parentWidth, parentHeight);
5 setDuration( 500 );
6 setFillAfter( true );
7 // 保存View的中心點
8 halfWidth = width / 2 ;
9 halfHeight = height / 2 ;
10 setInterpolator( new AccelerateDecelerateInterpolator());
11 }
說明一下做法:
其中setInterpolator(new AccelerateDecelerateInterpolator())選擇一個先加速后減速的效果
最后動畫的部分里面
2
3 final Matrix matrix = t.getMatrix();
4 if (interpolatedTime < 0.8 ) {
5 matrix.preScale( 1 + 0.625f * interpolatedTime, 1 - interpolatedTime / 0.8f + 0.01f ,halfWidth,halfHeight);
6 } else {
7 matrix.preScale( 7.5f * ( 1 - interpolatedTime), 0.01f ,halfWidth,halfHeight);
8 }
9 }
interpolatedTime表示的是當前動畫的間隔時間 范圍是0-1

希望大家喜歡~
通過重寫Animation的 applyTransformation (float interpolatedTime, Transformation t)函數來實現自定義動畫效果,另外一般也會實現 initialize (int width, int height, int parentWidth, int parentHeight)函數,這是一個回調函數告訴Animation目標View的大小參數,在這里可以初始化一些相關的參數,例如設置動畫持續時間、設置Interpolator、設置動畫的參考點等。在繪制動畫的過程中會反復的調用applyTransformation 函數,每次調用參數interpolatedTime值都會變化,該參數從0漸變為1,當該參數為1時表明動畫結束。通過參數Transformation 來獲取變換的矩陣(matrix),通過改變矩陣就可以實現各種復雜的效果。
public class MyAnimation extends Animation {
int mCenterX,mCenterY;
public MyAnimation() {
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
//通過Matrix.setScale函數來縮放,該函數的兩個參數代表X、Y軸縮放因子,由於interpolatedTime是從0到1變化所在這里實現的效果就是控件從最小逐漸變化到最大。
Matrix matrix = t.getMatrix();
matrix.setScale(interpolatedTime, interpolatedTime);
//Matrix 可以實現各種復雜的變換
//preTranslate函數是在縮放前移動而postTranslate是在縮放完成后移動。
matrix.preTranslate(-mCenterX, -mCenterY);
matrix.postTranslate(mCenterX,mCenterY);
}
@Override
public void initialize(int width, int height, int parentWidth,
int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
//初始化中間坐標
mCenterX = width/2;
mCenterY = height/2;
//設置變換持續的時間2500毫秒,然后設置Interpolator為LinearInterpolator並設置FillAfter為true這樣可以在動畫結束的時候保持動畫的完整性。
setDuration(2000);
setFillAfter(true);
setInterpolator(new LinearInterpolator());
}
}