极客学院Animation教程讲解的很详细,点击进入哦
这里为学习的整理和补充O(∩_∩)O
一、秒懂Evaluator概念
看图⬇️
是不是非常简单明了?还记得上一篇的表达式(位置=开始值+(结束值-开始值)*进度)么?这个表达式就是在Evaluator计算的哦,由此,可以这样认为,Evaluator 是根据插值器返回的进度转换成当前位置所对应的值
二、IntEvaluator &FloatEvaluato的使用
- 首先要注意这一点:
只有在动画数值类型一样时,所对应的 Evaluator 才能通用。所以 ofInt()对应的 Evaluator 类名叫 IntEvaluator,而 ofFloat()对应的 Evaluator 类名叫 FloatEvaluator; 在设置 Evaluator 时,是通过 animator.setEvaluator()来设置的
- 直接上代码O(∩_∩)O
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int) animation.getAnimatedValue();
view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
}});
//设置Evaluator
valueAnimator.setEvaluator(new IntEvaluator());
valueAnimator.start();
- ** 一起揭开IntEvaluator的庐山真面目**
/**
*This evaluator can be used to perform type interpolation between <code>int</code> values.
*/
public class IntEvaluator implements TypeEvaluator<Integer> {
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(startInt + fraction * (endValue - startInt));
}}
是不是和我们的表达式逻辑一模一样,哈哈
既然如此,就来自定义Evalutor,自己写表达式吧<( ̄︶ ̄)↗[GO!]
三、自定义IntEvalutor
-
还是直接上代码(其实,就是仿写IntEvaluator哦)
public class MyEvaluator implements TypeEvaluator<Integer> {
@Override
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(endValue-(endValue-startInt)*fraction);
}}
调用MyEvaluator
......
valueAnimator.setEvaluator(new MyEvaluator());
......
该例子得到的效果是:从终点移动到起点O(∩_∩)O~
四、使用和自定义ArgbEvalutor
- 老样子,上代码
//控制颜色变化,实现view的背景色从透明红色->不透明蓝色变化
ValueAnimator valueAnimator = ValueAnimator.ofInt(0x00ff0000, 0xff0000ff);
//argbvalue
Animator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int) animation.getAnimatedValue();
view.setBackgroundColor(curValue);
}});
valueAnimator.setEvaluator(new ArgbEvaluator());
valueAnimator.start();
- 揭开ArgbEvaluator神秘面纱,吼吼
/**
This evaluator can be used to perform type interpolation between integer * values that represent ARGB colors.
*/
public class ArgbEvaluator implements TypeEvaluator {
private static final ArgbEvaluator sInstance = new ArgbEvaluator();
public Object evaluate(float fraction, Object startValue, Object endValue) {
int startInt = (Integer) startValue;
int startA = (startInt >> 24) & 0xff;
int startR = (startInt >> 16) & 0xff;
int startG = (startInt >> 8) & 0xff;
int startB = startInt & 0xff;
int endInt = (Integer) endValue;
int endA = (endInt >> 24) & 0xff;
int endR = (endInt >> 16) & 0xff;
int endG = (endInt >> 8) & 0xff;
int endB = endInt & 0xff;
return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
(int)((startR + (int)(fraction * (endR - startR))) << 16) |
(int)((startG + (int)(fraction * (endG - startG))) << 8) |
(int)((startB + (int)(fraction * (endB - startB))));
}}
>>n表示带符号右移,<<代表左移,&是与,这里就不做过多叙述咯(如果忘记的话,就查一下二进制的运算吧)
- 自定义ArgbEvaluator
-
还是直接上代码(*其实,就是仿写ArgbEvaluator *)
public class MyEvaluator implements TypeEvaluator<Integer> {
@Override
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(endValue-(endValue-startInt)*fraction);
}}
后记:
Evaluator也结束了,所谓得数学者,得Evaluator是也~