标签:
转载请标明出处: http://blog.csdn.net/Airsaid/article/details/51591282
本文出自:周游的博客
上一篇写了补间动画的使用,由于篇幅原因,就把自定义补间动画单独拿出来了。这一篇继续写补间动画~
在上一篇中写到了Android提供了Animation类作为补间动画的抽象基类,并提供了四个子类:ScaleAnimation 、TranslateAnimation、AlphaAnimation、RotateAnimation分别实现了四种基本动画形式:缩放改变、位置改变、透明度改变和旋转改变。
但是我们在实际项目开发中,也有可能遇到更复杂的动画形式。比如说:三维旋转等。那么这个时候Android自己提供的就不能满足我们的需求了。我们需要自己来定义一个补间动画。
其实自定义补间动画并不难,我们只需要继承Animation抽象类,继承Animation类的关键是要重写该抽象类的applyTransformation(float interpolatedTime, Transformation t)方法,该方法中的两个参数说明如下:
* interpolatedTime:代表了动画的时间进行比。不管动画实际的持续时间如何,当动画播放时,该参数总是自动从0变化到1。
Transformation代表了对图片或视图的变形程度,该对象里封装了一个Matrix对象,对它所包装的Matrix对象进行旋转、位置、倾斜等变换时,Transformation将会控制所对于的图片或者视图进行相应的变换。
下面以一个自定义三位旋转的补间动画为例,演示下自定义补间动画的使用。
首先需要介绍一个类:Camera。这个Camera并非代表手机的摄像头,而是一个空间变换工具,作用有点类似于Matrix,但是比Matrix更加强大。
Camera提供了如下常用方法:
* getMatrix(Matrix matrix):将Camera所做的变换应用到指定的Matrix上。
* rotateX(float deg):使目标组件沿X轴旋转。
* rotateY(float deg):使目标组件沿Y轴旋转。
* rotateZ(float deg):使目标组件沿Z轴旋转。
* translate(float x, float y, float z):使目标组件在三维空间里进行位移变换。
* applyToCanvas(Canvas canvas):把Camera所做的变换应用到Canvas上。
下面的程序里利用Camera来自定义在三维空间的动画,该程序的自定义动画类代码如下:
/**
* 作者:周游
* 时间:2016/06/05 13:03
* 描述:自定义补间动画演示(三维旋转动画)
*/
public class CustomTweenAnimation extends Animation {
private float mCenterX;
private float mCenterY;
private int mDuration;
private Camera mCamera = new Camera();
public CustomTweenAnimation(float x, float y, int duration) {
this.mCenterX = x;
this.mCenterY = y;
this.mDuration = duration;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
// 设置动画持续时间
setDuration(mDuration);
// 设置动画结束后效果保留
setFillAfter(true);
// 设置匀速变换
setInterpolator(new LinearInterpolator());
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
mCamera.save();
// 根据interpolatedTime时间来控制x、y、z轴上的偏移
mCamera.translate(100.0f - 100.0f * interpolatedTime, 150.0f * interpolatedTime - 150
, 80.0f - 80.0f * interpolatedTime);
// 设置根据interpolatedTime时间在x轴上旋转不同角度
mCamera.rotateX(360 * interpolatedTime);
// 设置根据interpolatedTime时间在y轴上旋转不同角度
mCamera.rotateY(360 * interpolatedTime);
// 获取Transformation参数的Matrix对象
Matrix matrix = t.getMatrix();
// 将Camera所做的变换应用到Transformation的Matrix上
mCamera.getMatrix(matrix);
matrix.preTranslate(-mCenterX, -mCenterY);
matrix.postTranslate(mCenterX, mCenterY);
mCamera.restore();
}
}
启动动画:
CustomTweenAnimation customTweenAnimation = new CustomTweenAnimation(50, 50, 5000);
mTextView.startAnimation(customTweenAnimation);
运行结果:
标签:
原文地址:http://blog.csdn.net/airsaid/article/details/51591282