自定义动画非常简单,只需要实现它的applyTransformation的逻辑就可以了,不过通常情况下,还需要覆盖父类的initialize方法来实现一些初始化工作。applyTransformation方法有如下两个参数。
applyTransformation(float interpolatedTime, Transformation t)
第一个参数interpolatedTime就是前面讲的插值器的时间因子,这个因子是由动画当前完成的百分比和当前时间所对应的插值所计算的来的,取值范围为0到1.0。
第二个参数Transformation非常简单,它是矩阵的封装类,一般使用这个类来获得当前的矩阵对象,代码如下所示。
final Matrix matrix = t.getMatrix();
通过改变获得的matrix对象,可以将动画效果实现出来,而对于matrix的变换操作,基本可以实现任何动画效果。
@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {final Matrix matrix = t.getMatrix();//通过matrix的各种操作来实现动画matrix.XXXXXX;}};
通过模拟电视机关闭的效果来看看简单的矩阵变换是如何实现动画效果的。电视机关闭的效果非常简单,让一个图片纵向比率不断虽小即可,对于的矩阵处理方法如下。
mCenterWidth = imageView.getMeasuredWidth()/2;mCenterHeight = imageView.getMeasuredWidth()/2;Animation animation = new Animation() {@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {final Matrix matrix = t.getMatrix();//通过matrix的各种操作来实现动画matrix.preScale(1,1-interpolatedTime, mCenterWidth, mCenterHeight);}};animation.setDuration(1000);imageView.startAnimation(animation);
其中mCenterWidth和mCenterHeight即为缩放的中心点,设置为图片中心即可。这样,通过一个简单的矩阵变换,就可以模拟电视机关闭的动画,效果图如下所示。
当然,你可以设置更精确的插值器,并将0到1.0的时间因子拆分出不同的过程,从而对不同的过程采用不同的动画效果,模拟更加真实的特效。
接下来结合矩阵,并使用Camera类来实现一个自定义的3D动画效果。需要注意的是,这里的Camera并不是指手机中的相机,而是android.graphics.Camera中的Camera类,它封装了openGL的3D动画,从而可以非常方便地创建3D动画效果。把Camera想象成一个真实的摄像机,当物体固定在某处时,只需要移动摄像机就能拍摄到具有立体感的图像,因此通过它就可以实现各种3D效果,Camera类的坐标体系如图7.6所示。
下面继续分析代码的实现。首先,在初始化方法中对Camera和一些其他参数进行初始化,代码如下。
public void btn3DCustomAnimation(View view) {Animation animation = new Animation() {@Overridepublic void initialize(int width, int height, int parentWidth, int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);//设置默认时长setDuration(2000);//设置动画结束后保留状态setFillAfter(true);//设置默认插值器setInterpolator(new BounceInterpolator());mCenterWidth = imageView.getMeasuredWidth()/2;mCenterHeight = imageView.getMeasuredWidth()/2;}@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {final Matrix matrix = t.getMatrix();mCamera.save();//使用Camera设置旋转的角度mCamera.rotateY(mRotateY*interpolatedTime);//将旋转的角度设置到matrix上mCamera.getMatrix(matrix);mCamera.restore();//通过pre方法设置矩阵作用前的偏移量来改变旋转中心matrix.preTranslate(mCenterWidth,mCenterHeight);matrix.postTranslate(-mCenterWidth,-mCenterHeight);}};animation.setDuration(1000);imageView.startAnimation(animation);}
通过上面的代码可以看到,使用Camera类实现动画效果非常简单,无非就是设置三个坐标轴的旋转角度,不过需要注意是最后两行代码,通过这两行代码,可以改变旋转时的默认旋转中心。程序运行结果如下图所示。左图时默认图,右图时点击后的效果图。