上一篇介绍了ofInt和ofFloat的使用,那如果要填其他值怎么办呢,今天给大家简单的讲解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;
}
}
最终效果就是刚开文的效果啦,在欣赏一下吧~: