</pre>这几天写了一个关于图片的3D旋转的动画效果,在写这个动画的时候,我遇到了许多的问题,在这期间我查询了许多资料,弄懂了一些东西,也有一些东西没有弄懂。比如:<p></p><p><span style="font-size:24px">matrix.preTranslate(-centerX, -centerY);matrix.postTranslate(centerX, centerY);</span></p><p><span style="font-size:24px"></span></p><p><span style="font-size:24px">这两句的原理我到现在也没有弄懂。下面我就开始说我已经弄懂了的东西:</span></p><p><span style="font-size:24px">先上代码:</span></p><p><span style="font-size:24px"></span></p><pre name="code" class="java" style="font-size: 24px;">public void initialize(int width, int height, int parentWidth,
int parentHeight) {
// TODO Auto-generated method stub
super.initialize(width, height, parentWidth, parentHeight);
centerX = width /2;
centerY = height/2;
setDuration(DURATION);
camera = new Camera();
}
这个函数是一个回调函数,顾名思义,初始化initalize ,在一个图片调用动画的时候,系统会自动的回调这个函数,将图片的基本信息传入其中。比如图片的宽高。
public boolean getTransformation(long currentTime,
Transformation outTransformation) {
// TODO Auto-generated method stub
return super.getTransformation(currentTime, outTransformation);
}
在就是transformation函数,transformation代表的是图片的矩阵还有alpha值,使用这个函数得到图片的矩阵。
最后最重要的就是
protected void applyTransformation(float interpolatedTime, Transformation t) {
// TODO Auto-generated method stub
super.applyTransformation(interpolatedTime, t);
float from = 0.0f,to = 180.0f;
//翻转角度 interpolatedTime 基本上就是进度的意思
float degree = from + (to - from)*interpolatedTime;
if(degree == 180){
return ;
}
if(interpolatedTime > 0.5f){
//动画进度过半,将角度调整,以防出现镜像效果
degree = degree - 180;
}
float depth = (0.5f - Math.abs(interpolatedTime - 0.5f))*DEPTH_Z; //深度
final Matrix matrix = t.getMatrix();
camera.save();
camera.translate(0.0f, 0.0f, depth);
camera.rotateY(DEPTH_Z);
camera.getMatrix(matrix);
camera.restore();
//确保图片的翻转过程一直处于中心点
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
//动画进度值
if(listener != null){
listener.interpolatedTime(interpolatedTime);
}
}
这个applyTransformation 函数使是继承animation最重要的功能,通过重写animation可以灵活的设计自己的动画。
camera.translate(0.0f, 0.0f, depth);
这行代码 camera 类 的 translate 功能,是对图像进行平移 , 参数分别是 X,Y,Z, Z轴代表的是景色的深浅。因为applyTransformation 是在不停的调用,所以 interpolate 的值也在不停的变化,这样 depth 的值也是不停的变化,所以使用 canera 中的 rotate 对其进行旋转 。 最后得到最终的矩阵的值, 调用 restore 存储起来。