Android提供的平移动画有只有加速、减速等,如果我们需要其他的自定义动画效果,应该如何实现呢?这里作者就用自定义的算法来实现一个平移动画效果。
位移动画有多种时间插值算法,比如我们常用的有AccelerateDecelerateInterpolator、AccelerateInterpolator、DecelerateInterpolator等,这些插值算法是为了给平移动画添加各种效果,加速减速、加速、减速等,这里举个例子。
AccelerateDecelerateInterpolatorinterpolator = new AccelerateDecelerateInterpolator(); TranslateAnimation translateAnim2 = new TranslateAnimation(0,-300,0,-500); translateAnim2.setDuration(600); translateAnim2.setInterpolator(interpolator); translateAnim2.setFillAfter(true); mImageView.startAnimation(translateAnim2);于是,一个ImageView的加速减速效果的平移动画就成形了。
这里是让ImageView进行平移动画,同时,平移的效果是先加速,再减速。
那么,插值是如何让平移动画先加速再减速的呢?
我们先来看一下DecelerateInterpolator的算法吧。
interpolatedTime = (1.0f - (1.0f - input) * (1.0f - input))
input可以理解为用时的百分比,interpolatedTime 可以理解为移动距离的百分比(取值范围0%——100%)。
这是一个input自变量范围在[0,1],于是interpolatedTime 值的范围也在[0,1]的连续函数,我自己理解这里自变量就是总时间的比例(取值
为%0,100%),函数值就是运动距离的比例(取值为%0,100%)。其函数图:
例如:
现在插值input为 0.2(即用了总时间的20%),我用公式计算得到一个值interpolatedTime 为0.3,也就是运动了整个距离的30%,那么该View的x坐标值运动计算公式:
mFromXDelta + ((mToXDelta - mFromXDelta) * interpolatedTime)
其中,mFromXDelta 为运动起始x坐标,mToXDelta为运动终点x坐标,那这样的话,就运动了总长度的0.3,一直到interpolatedTime 的值为1,整个动画就结束了。
那么,函数的斜率其实就是速度,如图,DecelerateInterpolator函数的斜率是不断减小的,于是产生了减速的效果。
好了,现在我们就可以着手写一个自己想要的动画效果算法了,只需用满足以下条件即可:
1.函数是连续的,如果不连续,动画效果将不会连续
2.自变量范围[0,1],自变量的值是系统生成的
3.函数值域为[0,1]
于是,我自己写了一个弹性的加速减速效果(android自己提供的加速减速效果不够猛烈啊),代码如下:
if (t < 0.4) { return (float)(t*t); }else if (t >= 0.4 &&t <= 0.6) { return (float)(3.4*t - 1.2); }else return (float)(1.0f - (1.0f - t) * (1.0f - t));
函数图象如下:
用这个算法,加速减速效果就非常明显啦!接下来,自己去创建一个类似DecelerateInterpolator的类,将这个算法写入getInterpolation()方法就可以直接使用了。
同时,我想,旋转等效果的动画算法原理也应该是一样的,所以,咱们可以自己去实现很多效果的动画!