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

android属性动画ValueAnimator详解

程序员文章站 2022-05-04 23:32:30
...

ValueAnimator:通过不断控制值的变化,在不断手动的赋给对象的属性,从而实现动画的效果
ValueAnimator 的常用方法:
ValueAnimator.ofInt(int values) ValueAnimator.ofFloat(float value) ValueAnimator.ofObject(int values)
废话不多哔哔 直接开始

ValueAnimator.ofInt(int values)的使用

首先看一下源码熟悉一下

 public static ValueAnimator ofInt(int... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setIntValues(values);
        return anim;
    }

源码很简单 就是将值赋给了ValueAnimator 这个对象
简单的demo:

     private Button btn;
     private ValueAnimator valueAnimator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animator_text);
        btn = findViewById(R.id.haha);
        valueAnimator = ValueAnimator.ofInt(btn.getLayoutParams().width,300);
        valueAnimator.setDuration(1500);//时间时长

        // 设置动画延迟播放时间
        valueAnimator.setStartDelay(500);

        // 设置动画重复播放次数 = 重放次数+1
        // 动画播放次数 = infinite时,动画无限重复
        valueAnimator.setRepeatCount(2);

        // 设置重复播放动画模式
        // ValueAnimator.RESTART(默认):正序重放
        // ValueAnimator.REVERSE:倒序回放
        valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
       
        // 数值每次变化更新都会调用该方法
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animator) {

                int currentValue = (Integer) animator.getAnimatedValue();
                // 获得每次变化后的属性值
               

                btn.getLayoutParams().width = currentValue;
                // 每次值变化时,将值手动赋值给对象的属性
               

             // 步骤4:刷新视图,即重新绘制,从而实现动画效果
                btn.requestLayout();

            }
        });

        valueAnimator.start();
        // 启动动画



    }

layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AnimatorText">

    <Button
        android:id="@+id/haha"
        android:layout_width="80dp"
        android:layout_height="50dp"
        android:layout_centerInParent="true"
        android:text="哈哈"
        />
</RelativeLayout>

ValueAnimator.ofFloat() 和ofInt()使用方法相似 在这里就不多做使用
然后直接上本次的重点 ValueAnimator.ofObject();
同样的 我们先来看一下源码:

 public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setObjectValues(values);
        anim.setEvaluator(evaluator);
        return anim;
    }

其中的第一个参数为TypeEvaluator(估值器):数值具体变化过程的当前数值
然后我们看一下估值器的源码:

public interface TypeEvaluator<T> { 
     //fraction -> 从开始到结束的分数(占比)
     //startValue ->起始值
     //endValue  ->结束值
    public T evaluate(float fraction, T startValue, T endValue);
}

也很简单 就是一个接口 里面有一个方法
要想使用ValueAnimator.ofObject()我们就需要实现TypeEvaluator的接口

详细的demo 我也没写 就到这吧 还有TypeEvaluator的实现类重写的方法中需要传的都是对象 而不是数值
这里面具体的实现根据你的业务逻辑自己去实现 这里面可以去参考FloatEvaluator的源码以及IntEvaluator的源码