学习笔记
之前在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初学者就会问这么一些列的问题啦:
- applyTransformation()这个方法什么时候被调用的啊
- applyTransformation()方法里面的两个参数是什么含义啊。
- matrix 是什么鬼,拿来干嘛的啊
- camera不是相机么,关3D旋转什么事啊
- save()和restore()又是什么东西啊
好吧,当我最初看到这些代码的时候我就抛出了这么一系列的问题。对于我这种只有一些C语言基础的人,完全不能理解上面代码运行的逻辑啊。
不过,通过我不懈的努力,基本把上面的问题解决了:
applyTransformation()这个方法什么时候被调用的啊
通过重写Animation的applyTransformation(float interpolatedTime, Transformation t)函数来实现自定义动画效果。在绘制动画的过程中会反复的调用applyTransformation函数,每次调用参数interpolatedTime值都会变化,该参数从0渐 变为1,当该参数为1时表明动画结束。(来自网络)
applyTransformation()方法里面的两个参数是什么含义啊。
在第一个问题中说到了interpolatedTime,按照我的理解,interpolatedTime是0 - 1 的值,那么就是动作完成的百分比咯。
Transformation是一个矩阵的封装类,就是用来得到一个Matrix(矩阵)咯,也就是Matrix matrix = t.getMatrix();这句话啦Matrix 是什么鬼,拿来干嘛的啊
对于一个图片变换的处理,需要Matrix类的支持,它位于”android.graphics.Matrix”包下,是Android提供的一个矩阵工具类,它本身不能对图像或View进行变换,但它可与其他API结合来控制图形、View的变换,如Canvas,Camera等。
camera不是相机么,关3D旋转什么事啊
这里使用的Camera是android.graphics.Camera下的类,而我们说的相机是android.hardware.Camera的类喔~~。所以不要混淆啦
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(),然后就没有动画效果了,不知道为什么)
好吧,大概就写到这里,如果有什么问题可以留言喔~~~