在github上看了一个小游戏的源码,发现一个Camera类做的动画特效挺好的,特此mark一下。注意,Android Api里面有两个Camera类,一个是hardware包下面的,就是我们熟悉的调用相机时用到的,另一个就是今天的主角,位于graphics包下面的Camera类。先来一张gif图看一下效果吧,如下:
主要代码:
public class Camera3dAnimation extends Animation {
private Camera camera;
//3D rotate;
private float centerX;
private float centerY;
private View fromView;
private View toView;
private boolean forward = true;
public Camera3dAnimation(View fromView, View toView) {
this.fromView = fromView;
this.toView = toView;
//动画持续的时间
setDuration(1000);
setFillAfter(false);
setInterpolator(new AccelerateDecelerateInterpolator());
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
//以中心为轴
centerX = width / 2;
centerY = height / 2;
camera = new Camera();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
//interpolated取值为0.0到1.0
float degrees = (float) (180.0 *interpolatedTime);
//一半之后显示toView
if (interpolatedTime >= 0.5f) {
degrees -= 180.f;
fromView.setVisibility(View.GONE);
toView.setVisibility(View.VISIBLE);
}
//绕着Y轴旋转180度(逆时针方向)后下一次动画就是顺时针方向
if (forward)
degrees = -degrees;
final Matrix matrix = t.getMatrix();
camera.save();
//以Y轴翻转
camera.rotateY(degrees);
camera.getMatrix(matrix);
camera.restore();
//preTranslate函数是在旋转前移动而postTranslate是在旋转完成后移动,主要作用是让对象围绕自己的中心二旋转
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
/**
* 当完成一次动画后,下次动画交换正面和反面
*/
public void reverse() {
forward = false;
View switchView = toView;
toView = fromView;
fromView = switchView;
}
}复制代码
这里我们看到动画效果的实现还是要借助Animation类,主要是覆写Aniamtion类的两个方法。initialized这里可以初始化一些相关的参数,例如设置动画持续时间、设置Interpolator、设置动画的参考点。另外一个方法applyTransformation决定了动画的具体实现效果,这个方法会在动画的过程中被不断的调用,大体思路是由Transformation来获取矩阵Matrix对象,通过改变矩阵就可以实现动画效果,以上面为例,camera.rotateY(degrees)表示绕着Y轴旋转degrees个度数,而degrees参数在动画过程中是随着时间在不断变化的。preTranslate函数是在旋转前移动而postTranslate是在旋转完成后移动,主要作用是让对象围绕自己的中心二旋转。