Android中动画之五属性动画高级用法三

一.概况

上一篇文章主要介绍了自定义估值器的用法,达到可以对任意类的任意属性进行动画处理的目的。而其中都是使用的默认插值器AccelerateDecelerateInterpolator,就是先加速后减速插值器。接下来我们看看插值器。

主要内容:插值器

差值器和估值器里面参数的关系

差值器的关键方法

float getInterpolation(float input);

估值器的关键方法

public T evaluate(float fraction, T startValue, T endValue)

差值器中参数input经过一定的数学运算得到float类型的数值是动画的完成度也就是估值器里面evaluate方法中的参数fraction。

二.系统自带差值器的使用

本篇文章是在上一篇的基础上,稍作改动从屏幕中间竖直向下移动。并将默认插值器替换为我们想要实验的插值器。
只需要改变ArgbAndPosView自定义View中的startAni。
如下

匀速差值器LinearInterpolator

    private void startAni() {
        //起点属性值
        Pointer startP = new Pointer(getWidth()/2,RADIUS,0xffff0000);
        //终点属性值
        Pointer endP = new Pointer(getWidth()/2,getHeight()-RADIUS,0xff00ff00);
        //对本自定义View的pointer属性进行动画处理,动画时间为4000毫秒,从startP到endP,插值器用的默认的
        ObjectAnimator ani = ObjectAnimator.ofObject(this,"pointer",new PointerEvaluator(),startP, endP);
        //设置插值器:线性插值器
        ani.setInterpolator(new LinearInterpolator());
        ani.setDuration(4000);
        ani.start();
    }

匀速插值器效果

这里写图片描述

加速差值器AccelerateInterpolator

只是将差值器更换掉

ani.setInterpolator(new AccelerateInterpolator());

看效果图

这里写图片描述

从中我们也可以清楚的看到效果。其他的在这里就不全部展示了,下面我们看差值器到底是个什么东东。

三.插值器分析和自定义插值器

3.1插值器分析

前面的Android中动画之三属性动画高级用法一中我们对差值器有了初步了解,这里我们直接看一下系统自带差值器的源码,看看里面是怎么工作的。

看一下LinearInterpolator

public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {

    public LinearInterpolator() {
    }

    ...省略代码...

    //关键方法:传入什么就原值返回
    public float getInterpolation(float input) {
        return input;
    }

    ...省略代码...
}

看一下AccelerateInterpolator

下面是其中的关键代码,注意看注释

public class AccelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
    //两个关键参数,可以认为是整个动画中扮演“速度”角色。而差值器返回的数值代表“完成度”角色
    private final float mFactor;
    private final double mDoubleFactor;

    //无参构造方法,默认设置两个属性值
    public AccelerateInterpolator() {
        mFactor = 1.0f;
        mDoubleFactor = 2.0;
    }

    //有参构造,传入“速度值”
    public AccelerateInterpolator(float factor) {
        mFactor = factor;
        mDoubleFactor = 2 * mFactor;
    }

    ...省略代码...

    //根据“速度值”决定完成度计算方式。
    public float getInterpolation(float input) {
        if (mFactor == 1.0f) {
            return input * input;
        } else {
            return (float)Math.pow(input, mDoubleFactor);
        }
    }

    ...省略代码...
}

注意

  1. 关键方法是getInterpolation,根据传入值计算出动画完成度值
  2. 不同差值器,采用不同的数学模型来计算完成度值,这个算法也正是产生不同差值器的关键。

3.2自定义插值器

从上面我们看到只要getInterpolation中的算法自己定义,就能完成简单的差值器的定义。这里就不给出具体的算法,要根据具体业务需求来制定需要的算法。

四.ViewPropertyAnimator的用法

属性动画针对的是任意类的任意属性,但是我们平时开发中主要操作的是View,如果只提供这些麻烦的api那么就显得不够人性化了。于是在3.1加入了ViewPropertyAnimator。

先看效果

这里写图片描述
很简单就是一个平移加拉伸。
下面是关键代码

    private void initView() {
        showTv = (TextView) findViewById(R.id.show_tv);

        //关键代码
        showTv.animate().translationX(300).scaleX(2).setDuration(4000);
    }

从上面我们可以知道

  • ViewPropertyAnimator由View的animate方法产生
  • 每个连续方法都返回ViewPropertyAnimator的实例
  • 可以以连续调用方式获取组合动画
  • 不必显示调用start方法

虽然使用这种方式可以实现和上面使用ValueAnimator和ObjectAnimator一样的效果,但是我更愿意使用上面的ValueAnimator和ObjectAnimator,更加灵活可扩展,当然这个看个人喜好。

五.总结

Android中动画使用时候注意的问题。

  1. OOM问题,主要是帧动画,图片过大造成的。
  2. 内存泄漏,属性动画中存在无限循环的情况,此类动画在Activity退出时候应该及时停止,否则造成Activity无法释放造成内存泄漏;通过验证后发现View动画并不存在这个问题。
  3. 兼容性问题,动画在3.0以下版本存在兼容性问题。属性动画在3.0以后新加的,即使有兼容包提供兼容方案,也只是表面现象一样,实质还是View动画。

猜你喜欢

转载自blog.csdn.net/gongxiaoou/article/details/80767339