android 自定義動畫2

轉載自:http://www.cnblogs.com/olvo/archive/2012/04/25/2469264.html


在代碼中繼承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 做了幾個小動畫 分享給大家~

 
大家都看過老式電視機關閉的時候畫面一閃消失的那個效果吧~
覺得那個不錯~就試着做一個~

先看效果圖~

下面是javaCode 

首先創建一個TVOffAnimation繼承於Animation,這個類是專門做動畫效果的~不用多說了吧~

 
然後在initialize裏面設置一些參數
複製代碼
複製代碼
 1 public void initialize(int width, int height, int parentWidth,
 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())選擇一個先加速後減速的效果

最後動畫的部分裏面

複製代碼
複製代碼
1 protected void applyTransformation(float interpolatedTime, Transformation t) {
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

那麼橫向來講前80%的時間我們要橫向拉伸到150%,縱向是直接減小,最後只留一條線。
後20%的時間裏我們要橫向從150%壓縮至0%,縱向保持不變就好了,當橫向爲0的時候就全部消失了。
可能大家對於1+0.625f*interpolatedTime, 1-interpolatedTime/0.8f+0.01f,7.5f*(1-interpolatedTime),0.01f 這4個值比較疑惑,其實很簡單,這是一個一次函數的函數值
如圖爲sx的變化曲線
恩 很簡單 附一個小demo~

/Files/mudoot/TVOffDemo.rar 

希望大家喜歡~ 


通過重寫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());
}
}

發佈了5 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章