上篇已经简单介绍了Android的一些动画,当然也包括Property Animation动画,这次再来记录下InterpolatorTypeEvaluator。也是对属性动画的一个扩展。

一、Interpolator (插值器)

Interpolator 被用于定义动画的变化速率。也可以说是加速度。系统自带了一些插值器如下:

  • AccelerateDecelerateInterolator:先加速后减速
  • AccelerateInterpolator:加速
  • DecelerateInterpolator:减速
  • AnticipateInterpolator:先向相反方向改变一段再加速播放
  • AnticipateOvershootInterpolator:先向相反方向改变,再加速播放,会超出目标值然后缓慢移动至目标值,类似于弹簧回弹
  • BounceInterpolator:快到目标值时值会跳跃
  • CycleIinterpolator:动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI
  • input)
  • LinearInterpolator:线性均匀改变
  • OvershottInterpolator:最后超出目标值然后缓慢改变到目标值
  • TimeInterpolator:一个允许自定义Interpolator的接口,以上都实现了该接口

都是通过:
valueAnimator.setInterpolator(new LinearInterpolator());
设置即可。

当没有为动画设置插值器时,系统默认会帮你设置加减速插值器 AccelerateDecelerateInterpolator

来看下使用了插值器的效果是什么样的:

这里写图片描述
此效果是设置了 BounceInterpolator 的样子,在临近消失时有弹跳效果。貌似很酷的感觉,来看下BounceInterpolator的源码:

/** * An interpolator where the change bounces at the end. */public class BounceInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {    public BounceInterpolator() {    }    @SuppressWarnings({"UnusedDeclaration"})    public BounceInterpolator(Context context, AttributeSet attrs) {    }    private static float bounce(float t) {        return t * t * 8.0f;    }    public float getInterpolation(float t) {        t *= 1.1226f;        if (t < 0.3535f) return bounce(t);        else if (t < 0.7408f) return bounce(t - 0.54719f) + 0.7f;        else if (t < 0.9644f) return bounce(t - 0.8526f) + 0.9f;        else return bounce(t - 1.0435f) + 0.95f;    }    /** @hide */    @Override    public long createNativeInterpolator() {        return NativeInterpolatorFactoryHelper.createBounceInterpolator();    }}

代码不是很多,很多都是写在getInterpolation方法里了。其实我们只关注getInterpolation(float input)这个方法,getInterpolation()方法接收一个input参数,input参数是系统根据设置的动画持续时间计算出来的,取值范围是[0,1],从0匀速增加到1。再来看下LinearInterpolator(线性插值器) 的源码呢:

/** * An interpolator where the rate of change is constant */public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {    public LinearInterpolator() {    }    public LinearInterpolator(Context context, AttributeSet attrs) {    }    public float getInterpolation(float input) {        return input;    }    /** @hide */    @Override    public long createNativeInterpolator() {        return NativeInterpolatorFactoryHelper.createLinearInterpolator();    }}

LinearInterpolator的 getInterpolation (float input)方法是直接把input参数作为返回值返回了!由于input参数是从0匀速增加到1的,所以自然就是线性插值器了。
所以上面的 BounceInterpolator 插值器就是直接操作的 getInterpolation() 返回input实现的弹跳效果。

二、TypeEvaluator(估值器)

作用是估算我们动画执行到什么程度,什么时间执行什么动画的一个类。
系统内置了一些估值器:
ArgbEvaluator, FloatArrayEvaluator, FloatEvaluator, IntArrayEvaluator, IntEvaluator, PointFEvaluator, RectEvaluatorTypeEvaluator

TypeEvaluator:自定义属性值接口,譬如对象属性值类型不是int、float、color类型,你必须实现这个接口去定义自己的数据类型。

public interface TypeEvaluator {         /**       * @param fraction   The fraction from the starting to the ending values       * @param startValue The start value.       * @param endValue   The end value.       * @return A linear interpolation between the start and end values, given the       *         fraction parameter.       */      public T evaluate(float fraction, T startValue, T endValue);     }

这里有三个函数:fraction: 表示当前这段数值变化值得比例(float 0~1),startValue:表示当前这段数值变化的开始值,endValue: 表示当前这段数据变化的结束值。
来看一个自定义 TypeEvaluator 的效果,那么接着玩球~:

这里写图片描述
一个小球抛物线的效果。

private class PositionEvaluator implements TypeEvaluator {        @Override        public Object evaluate(float fraction, Object startValue, Object endValue) {            mPoint.x = 445 * fraction * 3;            mPoint.y = 0.5f * 480 * (fraction * 3) * (fraction * 3);            return mPoint;        }    }

通过 fraction 的变化值计算小球的XY坐标比例。

三、总结

  1. 自定义Interpolator需要重写getInterpolation(float input),控制时间参数的变化;
  2. 自定义TypeEvaluator需要重写evaluate()方法,计算对象的属性值并将其封装成一个新对象返回;

四、扩展

接下来举个根据Interpolator和TypeEvaluator写的一个 点赞效果 的栗子:

点赞效果
具体实现上面都有说明,详情代码可见GitHub: https://github.com/SundayYoung/PropertyAnimatorDemo

更多相关文章

  1. Android(安卓)Paint之PathEffect(路径效果)
  2. Android(安卓)三种动画详解及简单实例
  3. AdapterViewFlipper实现跑马灯横幅广告滚动效果
  4. Android(安卓)启动程序时动画效果(渐变)
  5. Animation & Property Animation 使用
  6. Android常用动画Animation的使用
  7. android 点击效果动画增强
  8. Android(安卓)Studio实现微信摇一摇(传感器)
  9. android 抽屉 效果

随机推荐

  1. Android(安卓)2.2 源码结构分析
  2. kotlin初窥之Kotlin Android Extensions
  3. iphone开发之常用控件的使用详解
  4. 【Android】 NDK开发基础
  5. android架构介绍
  6. 探究Android 中 WebView 与 JS 的交互
  7. Android使用DrawerLayout和ToolBar实现仿
  8. [转]Android(安卓)3D 编程:HelloArrow(用 O
  9. android 图形系统加速学习系列 (一)
  10. 获取PCM音频数据的声音分贝值