2013-02-06 55 views
12

我想在Android中更改視圖的同時爲Flipboard創建動畫。Android Flipboard動畫

是否可以在整個佈局上爲Flipboard設置動畫效果?類似於圖片上的字母,但整個佈局。

例如:

<LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

// whole layout design 

<LinearLayout/> 

我想作的動畫改變時此佈局和/或充氣另一個做Flipboard的動畫。

Flipboard animation

的動畫應該看起來就像this one

+1

http://code.google.com/p/android-3d-flip-view-transition/ – dilix

+0

@dilix我正在尋找像這樣的動畫http://www.youtube.com/watch?v= w1fTI7oYfbI – Naskov

+2

我覺得這個帖子很有幫助:http://openaphid.github.com/blog/2012/05/21/how-to-implement-flipboard-animation-on-android/ – dilix

回答

2

此問題的答案在GitHub上。 OpenAphid提供的非常好的例子。訪問此link

+0

這個解決方案在活動之間不起作用,是嗎? – Billda

+0

@Billda這是一年前問的,直到現在你可以找到另一種方式來做這個動畫,而且,嗯,我沒有嘗試過,因爲所有的東西都有碎片。 – Naskov

+0

我相信你,但我不知道如何用碎片來實現它。因爲openAphid解決方案在單個活動/片段內工作,對嗎? – Billda

1

使用下面的代碼,他們是完全按您的需求:

第1類:

import android.graphics.Color; 
import android.view.Display; 
import android.view.View; 
import android.view.WindowManager; 
import android.view.animation.AccelerateInterpolator; 
import android.view.animation.Animation; 

    /** 
    * A class that is responsible switching the mode with the flip animation 
    */ 

    public class ViewSwitcher { 

     private final static int DURATION = 500; 
     private final static float DEPTH = 400.0f; 

     public interface AnimationFinishedListener { 
      /** 
      * Called when the animation is finished. 
      */ 
      public void onAnimationFinished(); 
     } 

     public static void animationIn(View container, WindowManager windowManager) { 
      animationIn(container, windowManager, null); 
     } 

     public static void animationIn(View container, WindowManager windowManager, AnimationFinishedListener listener) { 
      apply3DRotation(90, 0, false, container, windowManager, listener); 
     } 

     public static void animationOut(View container, WindowManager windowManager) { 
      animationOut(container, windowManager, null); 
     } 

     public static void animationOut(View container, WindowManager windowManager, AnimationFinishedListener listener) { 
      apply3DRotation(0, -90, true, container, windowManager, listener); 
     } 

     private static void apply3DRotation(float fromDegree, float toDegree, boolean reverse, View container, WindowManager windowManager, final AnimationFinishedListener listener) { 
      Display display = windowManager.getDefaultDisplay(); 
      final float centerX = display.getWidth()/2.0f; 
      final float centerY = display.getHeight()/2.0f; 

      final Rotate3dAnimation a = new Rotate3dAnimation(fromDegree, toDegree, centerX, centerY, DEPTH, reverse); 
      a.reset(); 
      a.setBackgroundColor(Color.WHITE); 
      a.setDuration(DURATION); 
      a.setFillAfter(true); 
      a.setInterpolator(new AccelerateInterpolator()); 
      if (listener != null) { 
       a.setAnimationListener(new Animation.AnimationListener() { 
        public void onAnimationStart(Animation animation) { 
        } 

        public void onAnimationRepeat(Animation animation) { 
        } 

        public void onAnimationEnd(Animation animation) { 
         listener.onAnimationFinished(); 
        } 
       }); 
      } 
      if(container != null){ 
       container.clearAnimation(); 
       container.startAnimation(a); 
      } 
      else if (listener != null) 
       listener.onAnimationFinished(); 
     } 
    } 

類2:

import android.view.animation.Animation; 
import android.view.animation.Transformation; 
import android.graphics.Camera; 
import android.graphics.Color; 
import android.graphics.Matrix; 

/** 
* An animation that rotates the view on the Y axis between two specified angles. 
* This animation also adds a translation on the Z axis (depth) to improve the effect. 
*/ 
public class Rotate3dAnimation extends Animation { 
    private final float mFromDegrees; 
    private final float mToDegrees; 
    private final float mCenterX; 
    private final float mCenterY; 
    private final float mDepthZ; 
    private final boolean mReverse; 
    private Camera mCamera; 

    /** 
    * Creates a new 3D rotation on the Y axis. The rotation is defined by its 
    * start angle and its end angle. Both angles are in degrees. The rotation 
    * is performed around a center point on the 2D space, definied by a pair 
    * of X and Y coordinates, called centerX and centerY. When the animation 
    * starts, a translation on the Z axis (depth) is performed. The length 
    * of the translation can be specified, as well as whether the translation 
    * should be reversed in time. 
    * 
    * @param fromDegrees the start angle of the 3D rotation 
    * @param toDegrees the end angle of the 3D rotation 
    * @param centerX the X center of the 3D rotation 
    * @param centerY the Y center of the 3D rotation 
    * @param reverse true if the translation should be reversed, false otherwise 
    */ 
    public Rotate3dAnimation(float fromDegrees, float toDegrees, 
      float centerX, float centerY, float depthZ, boolean reverse) { 
     super.setBackgroundColor(Color.WHITE); 
     mFromDegrees = fromDegrees; 
     mToDegrees = toDegrees; 
     mCenterX = centerX; 
     mCenterY = centerY; 
     mDepthZ = depthZ; 
     mReverse = reverse; 
    } 

    @Override 
    public void initialize(int width, int height, int parentWidth, int parentHeight) { 
     super.setBackgroundColor(Color.WHITE); 
     super.initialize(width, height, parentWidth, parentHeight); 
     mCamera = new Camera(); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     super.setBackgroundColor(Color.WHITE); 
     final float fromDegrees = mFromDegrees; 
     float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime); 

     final float centerX = mCenterX; 
     final float centerY = mCenterY; 
     final Camera camera = mCamera; 
     final Matrix matrix = t.getMatrix(); 

     camera.save(); 
     if (mReverse) { 
      camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); 
     } else { 
      camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); 
     } 
     camera.rotateX(degrees); 
     camera.getMatrix(matrix); 
     camera.restore(); 

     matrix.preTranslate(-centerX, -centerY); 
     matrix.postTranslate(centerX, centerY); 

    } 
} 

3類:

This Will be Your Actual activity where you should call following two calls to AnimationOut and AnimationIn with passing old view, new view respectively whenever you require to make your disered animation. 

現在請與第一個參數作爲舊視圖animationOut像下面除去:

ViewSwitcher.animationOut(this.findViewById(android.R.id.content1), getWindowManager(), new ViewSwitcher.AnimationFinishedListener() { 
      public void onAnimationFinished() { 
      //Do Something here before removing this view from screen if required. 
      } 
     }); 

現在稱之爲animationIn與第一個參數作爲新的視圖是如下所示:

ViewSwitcher.animationIn(this.findViewById(android.R.id.content2), this.getWindowManager()); 
+2

我做了upvoted,但我仍然試圖配置此動畫將我的視圖分成一半,確切地說我正在尋找。順便說一句,剪得很棒。我會接受答案,如果我設法將視圖分成兩半:) – Naskov

+0

動畫應該看起來完全像這個http://www.youtube.com/watch?v=w1fTI7oYfbI .. – Naskov

+2

@Naskov要分割您的視圖一半,並做了確切的改變角度,我認爲可以做到這一點。 –