欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-04 12:07:54
...

一.概况

上一篇文章主要介绍了自定义估值器的用法,达到可以对任意类的任意属性进行动画处理的目的。而其中都是使用的默认插值器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();
    }

匀速插值器效果

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

加速差值器AccelerateInterpolator

只是将差值器更换掉

ani.setInterpolator(new AccelerateInterpolator());

看效果图

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

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

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

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。

先看效果

Android中动画之五属性动画高级用法三
很简单就是一个平移加拉伸。
下面是关键代码

    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动画。