Android(安卓)动画系列之自定义补间动画
转载请标明出处: 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 :代表了补间动画在不同时刻对图形或组件的变形程度。
从上面的介绍可以看出,实现自定义补间动画的重点就在于重写applyTransformation方法时根据interpolatedTime时间来动态的计算动画对图形的变形程度。
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);
运行结果:
更多相关文章
- Android(安卓)属性动画(Property Animation)介绍
- Android中Animator & Animation比较
- Android手势识别ViewFlipper触摸动画
- Android(安卓)屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最
- Android动画详细探究
- Android——转屏时禁止调用onCreate()
- 从零开始打造一个Android(安卓)3D立体旋转容器
- Android取消RecyclerView、ListView、ScrollView、HorizontalScr
- Android中图像变换Matrix的原理、代码验证和应用(一)