Android 简单的3D旋转

本文详细解析了Android动画系统中的3D旋转原理,并通过实例代码展示了如何实现简单3D旋转动画。通过解释关键方法和概念,如applyTransformation()、Transformation、Matrix、Camera等,帮助初学者理解动画过程并解决常见疑惑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习笔记

之前在github中看到一个开源项目,里面使用了一些Animation的知识。因为没有接触过这方面的知识,所以这个星期一直在恶补Animation的知识,其中昨晚解决的一个问题就是实现3D旋转。

在网上找了一些3D旋转的代码,但是里面的内容比较的复杂,我只是想找一个最最简单的例子而已。所以今天就写了以这个最简单的例子,也分享一下我遇到的一些问题把。

首先我写了一个类,继承了Animation,然后只重写了applyTransFormation()方法。

class Rotate3d extends Animation {
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {

        Matrix matrix = t.getMatrix();
        Camera camera = new Camera();

        camera.save();
        camera.rotateY(50 * interpolatedTime);
        camera.getMatrix(matrix);
        camera.restore();

    }
}

好吧,看到了这段代码,一些向我这样Android初学者就会问这么一些列的问题啦:

  1. applyTransformation()这个方法什么时候被调用的啊
  2. applyTransformation()方法里面的两个参数是什么含义啊。
  3. matrix 是什么鬼,拿来干嘛的啊
  4. camera不是相机么,关3D旋转什么事啊
  5. save()和restore()又是什么东西啊

好吧,当我最初看到这些代码的时候我就抛出了这么一系列的问题。对于我这种只有一些C语言基础的人,完全不能理解上面代码运行的逻辑啊。

不过,通过我不懈的努力,基本把上面的问题解决了:

  1. applyTransformation()这个方法什么时候被调用的啊

    通过重写Animation的applyTransformation(float interpolatedTime, Transformation t)函数来实现自定义动画效果。在绘制动画的过程中会反复的调用applyTransformation函数,每次调用参数interpolatedTime值都会变化,该参数从0渐 变为1,当该参数为1时表明动画结束。(来自网络)

  2. applyTransformation()方法里面的两个参数是什么含义啊。

    在第一个问题中说到了interpolatedTime,按照我的理解,interpolatedTime是0 - 1 的值,那么就是动作完成的百分比咯。
    Transformation是一个矩阵的封装类,就是用来得到一个Matrix(矩阵)咯,也就是Matrix matrix = t.getMatrix();这句话啦

  3. Matrix 是什么鬼,拿来干嘛的啊

     对于一个图片变换的处理,需要Matrix类的支持,它位于”android.graphics.Matrix”包下,是Android提供的一个矩阵工具类,它本身不能对图像或View进行变换,但它可与其他API结合来控制图形、View的变换,如Canvas,Camera等。
     

  4. camera不是相机么,关3D旋转什么事啊

    这里使用的Camera是android.graphics.Camera下的类,而我们说的相机是android.hardware.Camera的类喔~~。所以不要混淆啦

  5. save()和restore()又是什么东西啊

    其实我写这篇博客主要只是想说说这个两个函数而已,其他的也顺便总结啦。

    说说我的理解把,这两个函数顾名思义就是保存和恢复状态呗。但是保存什么,恢复什么呢。

    现在我对我上面的代码做一些修改,添加一些输出语句:

        protected void applyTransformation(float interpolatedTime, Transformation t) {
    
        Matrix matrix = t.getMatrix();
        Camera camera = new Camera();
    
    
        camera.save();
    
        System.out.println(matrix + " strat");
    
        camera.rotateY(50 * interpolatedTime);
    
        camera.getMatrix(matrix);
    
        System.out.println(matrix + " Rotete");
        camera.restore();
        camera.getMatrix(matrix);
    
        System.out.println(matrix + " restore");
    
    }

    我对matrix在旋转之前,旋转之后,和restore()分别输出了他们的值,让我们看看结果把:
    这里写图片描述
    (这个方法去验证似乎有点问题,因为调用了两次的getMatrix(),然后就没有动画效果了,不知道为什么)

好吧,大概就写到这里,如果有什么问题可以留言喔~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值