本文主要是介绍关于Android动画插值器的简单介绍以及如何自定义自己的插值器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本篇博客介绍如何使用Android动画的差值,以及如何自定义自己的插值器。在Android中既可以通过在xml中为相应的动画设置插值器也可以通过java代码设置动画插值器,在android动画中,如果没有为动画指定插值器,则系统会默认设置为加速度插值器,具体的可以看一下代码上的实现。Android系统一共提供了9种差值器。下面我们来挨个看一下:
1、AccelerateDecelerateInterpolator :在动画开始与结束的地方速率改变比较慢,在中间的时候加速
效果如下:
gif现实的效果不是很明显,有兴趣的可以自己试一下,下面来看一下代码的具体实现。
AccelerateDecelerateInterpolator .java
public float getInterpolation(float input) {return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;}
这里的input指的是动画的进度,取值范围为0~1.而这里的返回值会在具体的动画中使用到,这里就以ScaleAnimation讲解一下,在ScaleAniamtion中的applyTransformation方法会对插值器的返回值进行处理,并最终确定Scale的值,还是看一下方法吧:
protected void applyTransformation(float interpolatedTime, Transformation t) {float sx = 1.0f;float sy = 1.0f;float scale = getScaleFactor();if (mFromX != 1.0f || mToX != 1.0f) {sx = mFromX + ((mToX - mFromX) * interpolatedTime);}if (mFromY != 1.0f || mToY != 1.0f) {sy = mFromY + ((mToY - mFromY) * interpolatedTime);}if (mPivotX == 0 && mPivotY == 0) {t.getMatrix().setScale(sx, sy);} else {t.getMatrix().setScale(sx, sy, scale * mPivotX, scale * mPivotY);}}
每一个Animation对插值器的返回处理都不太一样,但是目标都是相同,即根据差值器的返回值确定当前view的状态。具体的看一下上面的代码就知道了,在这里就不解释了!!!
2、AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始速率变化加快
效果图如下:
具体的实现代码:
AccelerateInterpolatorpublic float getInterpolation(float input) {if (mFactor == 1.0f) {return input * input;} else {return (float)Math.pow(input, mDoubleFactor);}}
Math.pow(x,y)的执行结果为x的y幂次。如果在代码中使用无参构造方法,mDoubleFactor的默认值是2.0,mDoubleFactor跟构造方法中传入的参数有关,具体的代码如下:
public AccelerateInterpolator(float factor) {mFactor = factor;mDoubleFactor = 2 * mFactor;}
3、LinearInterpolator:以常量速率改变
效果图如下所示:
在这个插值器中,直接返回动画的执行进度,也就是input。
public float getInterpolation(float input) {return input;}
4、AnticipateInterpolator:开始的时候向后然后向前甩
效果图如下所示:
具体实现代码:
public float getInterpolation(float t) {// a(t) = t * t * ((tension + 1) * t - tension)return t * t * ((mTension + 1) * t - mTension);}
如果在代码中实例化并采用无参构造方法,mTension的默认值为2。代码如下:
public AnticipateInterpolator() {mTension = 2.0f;}/*** @param tension Amount of anticipation. When tension equals 0.0f, there is* no anticipation and the interpolator becomes a simple* acceleration interpolator.*/public AnticipateInterpolator(float tension) {mTension = tension;}
在这里就不解释了,也没什么好解释的!!代码一目了然
5、CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线,使用这个插值器可能会让UI发生翻转,还是先看一下效果图吧,更加明显:
效果图如下图所示:
插值器实现的代码:
public float getInterpolation(float input) {return (float)(Math.sin(2 * mCycles * Math.PI * input));}
根据上述给出的ScaleAnimation中的就算方法,如果插值器返回的负值太小,可能会是scale值为负值,有兴趣的朋友可以自己试一下!!!
其中mCycles参数的值与构造方法有关:
public CycleInterpolator(float cycles) {mCycles = cycles;}
计算的时候,直接带入计算即可,在这里就不多说了!!!
6、anticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
具体的效果不好描述,直接看效果图吧:
效果图如下所示:
插值器的实现代码:
public float getInterpolation(float t) {// a(t, s) = t * t * ((s + 1) * t - s)// o(t, s) = t * t * ((s + 1) * t + s)// f(t) = 0
这篇关于关于Android动画插值器的简单介绍以及如何自定义自己的插值器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!