首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Flipboard动画

Android Flipboard动画
EN

Stack Overflow用户
提问于 2013-02-06 15:57:06
回答 2查看 7.4K关注 0票数 12

我想要动画的Flipboard,同时在Android中改变视图。

是否可以在整个布局上对Flipboard进行动画处理?与图片上的字母相似的东西,但整个布局。

例如:

代码语言:javascript
复制
<LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent">

// whole layout design

<LinearLayout/>

我想在更改此布局和/或充气另一个布局以制作Flipboard动画时制作动画。

动画应该与this one一模一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-30 22:43:22

这个问题的答案在GitHub上。OpenAphid提供了一个非常好的例子。请访问此link

票数 2
EN

Stack Overflow用户

发布于 2013-02-06 16:22:17

使用以下代码,它们完全符合您的要求:

第一类:

代码语言:javascript
复制
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();
        }
    }

第二类:

代码语言:javascript
复制
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);

    }
}

第三类:

代码语言:javascript
复制
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作为要删除的旧视图,如下所示:

代码语言:javascript
复制
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作为新视图,如下所示:

代码语言:javascript
复制
ViewSwitcher.animationIn(this.findViewById(android.R.id.content2), this.getWindowManager());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14724116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档