Android动画 —— 十几行代码的简单3D旋转动画

简明教程:Android 3D旋转动画的实现与参数设置
本文提供了一个简洁的Android 3D旋转动画实现示例,仅包含十几行有效代码,并详细解释了关键步骤及参数设置方法。通过示例学习如何设置旋转动画的参数,以便在动画中精确控制旋转中心,避免动画元素转出屏幕。此外,还介绍了如何通过调整动画参数使动画更加丰富和灵活。
在学习实现Android的3D旋转动画效果,在网上查到的文章全是长篇大论,花好半天看明白来,最终别人的方法由于种种原因,还不一定适合自己的需求,其实我就只想知道最简单的实现方式,对旋转动画的参数设置等可以等先明白了最简单的实现方法之后再一个个研究,但为什么总是为了知道这个最简单的实现方式,要看一大堆作者自己的应用里的一大堆令人头疼程序逻辑呢。
好不容易看明白这些逻辑之后,把自己最想知道的那一部分给抽取出来,写了一个很简单的示例,有效代码也就十几行,我想这区区十几行代码应该不会令人头疼了吧。

package com.example.test;

import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Camera;
import android.graphics.Matrix;

public class TestActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView tv = new TextView(this);
        tv.setText("3D Rotate");
        Rotate3d rotate = new Rotate3d();
        rotate.setDuration(1000);
        tv.startAnimation(rotate);
        setContentView(tv);
    }
}

class Rotate3d extends Animation {
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        Matrix matrix = t.getMatrix();
        Camera camera = new Camera();
        camera.save();

        // 设置camera动作为绕Y轴旋转
        // 总共旋转180度,因此计算在每个补间时间点interpolatedTime的角度即为两着相乘
        camera.rotateY(180 * interpolatedTime); 

        // 根据camera动作产生一个matrix,赋给Transformation的matrix,以用来设置动画效果
        camera.getMatrix(matrix);

        camera.restore();
    }
}



上述动画会转出屏幕,这时就需要对动画进行参数设置了,在明白了动画的实现方法之后,对一个个参数的设置不就容易的多了吗。下面代码中的注释部分即上再上述代码的基础上添加的设置旋转中心的过程,这样就可以使上述动画不会转出屏幕了。

package com.example.test;

import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Camera;
import android.graphics.Matrix;

public class TestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView tv = new TextView(this);
        tv.setText("3D Rotate");
        Rotate3d rotate = new Rotate3d();
        rotate.setDuration(1000);
//        tv.measure(0, 0);
//        rotate.setCenter(tv.getMeasuredWidth() / 2, tv.getMeasuredHeight() / 2);
//        rotate.setFillAfter(true); // 使动画结束后定在最终画面,如果不设置为true,则将会回到初始画面
        tv.startAnimation(rotate);
        setContentView(tv);
    }
}

class Rotate3d extends Animation {
//    private float mCenterX = 0;
//    private float mCenterY = 0;
//        
//    public void setCenter(float centerX, float centerY) {
//        mCenterX = centerX;
//        CenterY = centerY;
//    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        Matrix matrix = t.getMatrix();
        Camera camera = new Camera();
        camera.save();
        camera.rotateY(180 * interpolatedTime);
        camera.getMatrix(matrix);
        camera.restore();
//        matrix.preTranslate(-mCenterX, -mCenterY);
//        matrix.postTranslate(mCenterX, mCenterY);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值