android 自定義動畫2


在代碼中繼承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());
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM