Android动画(三)Property Animation属性动画ofObject使用

最终效果:

在这里插入图片描述

插值器介绍及使用

Interpolator的系统值有下面几个:
在这里插入图片描述

  • AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
  • AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
  • AnticipateInterpolator 开始的时候向后然后向前甩
  • AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
  • BounceInterpolator 动画结束的时候弹起
  • CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
  • DecelerateInterpolator 在动画开始的地方快然后慢
  • LinearInterpolator 以常量速率改变
  • OvershootInterpolator 向前甩一定值后再回到原来位置

xml中使用(alpha标签举例: ):

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:fillBefore="true"
    android:fromAlpha="0.1"
    这里使用的是弹跳插值器,上面已经写出作用,在动画结束时弹起,这里就不在细说
    android:interpolator="@android:anim/bounce_interpolator"
    android:repeatCount="3"
    android:repeatMode="reverse"
    android:toAlpha="1">
    
</alpha>

代码中使用:

valueAnimator.setInterpolator(new BounceInterpolator());

插值器参考文档 链接: 启舰.

Evaluator

执行的顺序:

这里的加速器就是插值器叫法不同一个意思:
在这里插入图片描述
大家可以很清楚的看到,先传入对应的数值,然后在走到加速器,在根据数字进度计算当前的值,最后在AnimatorUpdateListener中返回回来.

当前值公式:

当前的值 = 最小值 + (最大值 - 最小值)* 显示进度

举例:如果说小明从200米开始跑步,需要跑到500米的地方,当前已经跑了20%,问现在是在多少米处;
((500 - 200) * 0.2) + 200 = 当前的位置

这个公式很好理解,就不浪费大家时间了

补充知识

大家可能知道,int类型不止能设置int类型,也可以为char类型,表示的是获取当前的ASCII码

直接看代码:
(命名及其不规范,请各位不要像我看齐.,随便举例的~)

在这里插入图片描述

通过这2行代码可以看出:
A 的ASCII是 65
Z的ASCII是 90
以此类推 B的ASCII是66 , C的ASCII是67…

ObJect简单使用

有参构造:
ValueAnimator.ofObject(TypeEvaluator evaluator, Object… values);

 ValueAnimator valueAnimator = ValueAnimator.ofObject(new MyEvaluator(), 'A', 'Z');
    valueAnimator.setDuration(3000);
    valueAnimator.setInterpolator(new BounceInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            Character animatedValue = (Character) animation.getAnimatedValue();
            tv.setText(String.valueOf(animatedValue));
        }
    });
    valueAnimator.start();
}

可能有细心地朋友会发现:

为什么ofInt()和ofFloat()没有设置Evaluator呢,因为他源码里面已经设置了,不过也可以通过代码来改变.

valueAnimator.setEvaluator(TypeEvaluator value);

自定义TypeEvaluator< T >

创建MyEvaluator实现TypeEvaluator< T >接口;因为咋们传入的是char类型,所以这里传入的泛型就是char的包装类Character; 重写evaluate(float fraction, Character startValue, Character endValue) 方法

(命名及其不规范,请各位不要像我看齐.,随便举例的~)

public class MyEvaluator implements TypeEvaluator<Character> {
    @Override
    public Character evaluate(float fraction, Character startValue, Character endValue) {
        int end = endValue;
        int start = startValue;
        //套入获取当前值的公式 
         int a = (int) (start + ( fraction * (end - start)));
         char b = (char) a;
         return b;
    }
}

最终效果就是刚开文的效果啦,在欣赏一下吧~:
在这里插入图片描述

Git地址:链接: langyangyang.

参考文档:链接: 启舰.

猜你喜欢

转载自blog.csdn.net/weixin_44819566/article/details/106903538