Android 简单的3D旋转

来源:互联网 发布:淘宝怎么扫码付款 编辑:程序博客网 时间:2024/05/22 06:51

学习笔记

之前在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(),然后就没有动画效果了,不知道为什么)

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

0 0
原创粉丝点击