Rotate3dAnimation

概要:

    Roate3dAnimation 实现了围绕y轴竖直方向 或者绕x轴方向旋转的3d动画效果。这个例子来

自Android APIDemo中的一个自定义View动画。他的实现展示自定义View动画的基本步骤。

主要是重写initialize方法,applyTransformation方法。


分析:

    在Roate3dAnimation中,我们使用Android.graphic.Camera实现3d效果。

对Camera不熟悉的可看看android.graphic.Camera

public class Rotate3dAnimation extends Animation {

    //开始角度
    private float startDegree;
    //结束角度
    private float endDegree;

    /**
     * 这个旋转动画围绕在2D空间的中心点执行.你可以用X轴坐标(叫做centerX)和Y轴(叫做centerY)
     * 坐标来定义这个中心点
     */
    private float centerX;
    private float centerY;
    /**
     * 控制镜头景深,不需要的话给0值即可
     * mReverse 为true,表示反方向,false 表示正方向
     */
    private float deepZ;
    private boolean mReverse;
    //用于辅助实现3d效果。
    private Camera mCamera;

    //X轴方向,或Y轴方向
    enum DIRECTION {
        X, Y
    }

    DIRECTION direction = DIRECTION.Y;

    Rotate3dAnimation(float fromDegree, float toDegree, float centerX,
                      float centerY, float deepZ, boolean reverse) {
        this.startDegree = fromDegree;
        this.endDegree = toDegree;
        this.centerX = centerX;
        this.centerY = centerY;
        this.deepZ = deepZ;
        this.mReverse = reverse;
    }

    Rotate3dAnimation(float fromDegree, float toDegree, float centerX,
                      float centerY, float deepZ, boolean reverse, DIRECTION direction) {
        this.startDegree = fromDegree;
        this.endDegree = toDegree;
        this.centerX = centerX;
        this.centerY = centerY;
        this.deepZ = deepZ;
        this.mReverse = reverse;
        this.direction = direction;
    }

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

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        float fromDegree = startDegree;
        float degree = fromDegree + (endDegree - startDegree) * interpolatedTime;

        final Matrix matrix = t.getMatrix();

        mCamera.save();
        if (mReverse) {
            mCamera.translate(0, 0, deepZ * interpolatedTime);
        } else {
            mCamera.translate(0, 0, deepZ * (1 - interpolatedTime));
        }
        if (direction == DIRECTION.Y) {
            mCamera.rotateY(degree);
        } else {
            mCamera.rotateX(degree);
        }
        mCamera.getMatrix(matrix);
        mCamera.restore();

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

应用:

        iv_content.post(new Runnable() {
            @Override
            public void run() {
                Rotate3dAnimation rotate3dAnimation = new Rotate3dAnimation(0, 360, iv_content.getWidth()/2,
                        0, 0, true, Rotate3dAnimation.DIRECTION.Y);
                rotate3dAnimation.setDuration(3000);
                iv_content.setAnimation(rotate3dAnimation);
                rotate3dAnimation.start();
            }
        });



基于谷歌官方提供的3D翻转示例进行修改,修复了在不同设备上显示效果差异过大的问题。项目地址:https://github.com/GcsSloop/Rotate3dAnimation 效果图:如何使用:// 计算中心点(这里是使用view的中心作为旋转的中心点)         final float centerX = view.getWidth() / 2.0f;                 final float centerY = view.getHeight() / 2.0f;        //括号内参数分别为(上下文,开始角度,结束角度,x轴中心点,y轴中心点,深度,是否扭曲)         final Rotate3dAnimation rotation = new Rotate3dAnimation(this, start, end, centerX, centerY, 1.0f, true);         rotation.setDuration(1500);                               //设置动画时长         rotation.setFillAfter(true);                              //保持旋转后效果         rotation.setInterpolator(new AccelerateInterpolator());   //设置插值器         rotation.setAnimationListener(new AnimationListener() {   //设置监听器             @Override             public void onAnimationStart(Animation animation) {             }            @Override             public void onAnimationRepeat(Animation animation) {             }            @Override             public void onAnimationEnd(Animation animation) {             }         });         view.startAnimation(rotation);                            //开始动画
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值