2013-02-06 9 views
12

Chcę animować Flipboard podczas zmiany widoków w systemie Android.Animacja Android Flipboard

Czy można animować Flipboard na cały układ? Coś podobnego do tych liter na zdjęciu, ale cały układ.

Na przykład:

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

// whole layout design 

<LinearLayout/> 

Chciałbym zrobić animację podczas zmiany tego układu i/lub pompowania innego zrobić animację Flipboard.

Flipboard animation

Animacja powinien wyglądać dokładnie jak this one

+1

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

+0

@dilix Szukam animacji takiej jak ta http://www.youtube.com/watch?v= w1fTI7oYfbI – Naskov

+2

Myślę, że ten wpis jest pomocny: http://openaphid.github.com/blog/2012/05/21/how-to-implement-flipboard-animation-on-android/ – dilix

Odpowiedz

2

Odpowiedź na to pytanie dotyczy GitHub. Bardzo ładny przykład dostarczony przez OpenAphid. Odwiedź to link.

+0

To rozwiązanie nie działa między działaniami, prawda? – Billda

+0

@Billda to zostało zadane rok temu, do tej pory możesz znaleźć inny sposób na zrobienie tej animacji i, uhm, nie próbowałem tego, ponieważ wszystko dzieje się z fragmentami. – Naskov

+0

Wierzę, że ty, ale nie wiem jak to zaimplementować z fragmentami ani ... Ponieważ rozwiązanie openAphid działa w ramach pojedynczej aktywności/fragmentu, prawda? – Billda

1

użytkowania Następujące kody są dokładnie do Państwa wymagań:

Klasa 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(); 
     } 
    } 

Klasa 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); 

    } 
} 

Klasa 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. 

Teraz Wywołanie animationOut z pierwszego argumentu jako stary celu należy usunąć jak poniżej:

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. 
      } 
     }); 

Teraz Wywołanie animationIn z pierwszego argumentu jako nowy widok będzie pokazano poniżej:

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

Podjęłam przegłosowanie, ale nadal próbuję skonfigurować tę animację, aby podzielić mój widok na pół i zrób dokładnie to, czego szukam. Przy okazji snipped jest niesamowity. Zaakceptuję odpowiedź, jeśli uda mi się podzielić widok na pół :) – Naskov

+0

Animacja powinna wyglądać dokładnie tak: http://www.youtube.com/watch?v=w1fTI7oYfbI. – Naskov

+2

@Naskov Aby podzielić swój widok w Połowę i dokładną zmianę kątów. Myślę, że można to zrobić. –