3、TypeEvaluator估值器和Interpolator 差值器我们了解了下面6个类的基本用法,就基本彻底掌握了属性动画ObjectAnimator 对象动画ValueAnimator 值动画PropertyValueHolder 用于同时执行多个动画TypeEvaluator 估值器AnimatorSet 动画集合Interpolator 差值器
时间: 2025-04-05 22:05:53 浏览: 26
### TypeEvaluator 和 Interpolator 的作用及用法
#### 一、TypeEvaluator 起始值与结束值之间的插值计算
`TypeEvaluator` 是 Android 属性动画中的一个重要接口,用于定义如何在起始值和目标值之间进行插值运算。它允许开发者自定义不同数据类型的插值逻辑。
- **基本功能**: `TypeEvaluator` 接口提供了一个方法 `evaluate(float fraction, T startValue, T endValue)`,其中 `fraction` 表示当前时间进度(范围为 `[0, 1]`),`startValue` 和 `endValue` 则分别表示属性的初始值和最终值[^1]。
- **适用场景**: 当默认支持的数据类型无法满足需求时,可以通过实现该接口来自定义插值方式。例如,在颜色渐变或复杂对象变化的情况下,可以创建自己的 `TypeEvaluator` 实现。
```java
// 自定义 ColorEvaluator 示例
public class ColorEvaluator implements TypeEvaluator<Integer> {
@Override
public Integer evaluate(float fraction, Integer startColor, Integer endColor) {
int redStart = Color.red(startColor);
int greenStart = Color.green(startColor);
int blueStart = Color.blue(startColor);
int redEnd = Color.red(endColor);
int greenEnd = Color.green(endColor);
int blueEnd = Color.blue(endColor);
int red = (int)(redStart + fraction * (redEnd - redStart));
int green = (int)(greenStart + fraction * (greenEnd - greenStart));
int blue = (int)(blueStart + fraction * (blueEnd - blueStart));
return Color.rgb(red, green, blue);
}
}
```
上述代码展示了如何通过 `TypeEvaluator` 来实现颜色间的平滑过渡[^3]。
---
#### 二、Interpolator 动画速度曲线控制
`Interpolator` 定义了动画过程中每一帧的时间间隔分布规律,从而影响动画的速度变化模式。
- **常见内置 interpolator 类型**:
- LinearInterpolator: 匀速运动。
- AccelerateDecelerateInterpolator: 加速减速运动。
- DecelerateInterpolator: 减速运动。
- BounceInterpolator: 弹跳效果。
- OvershootInterpolator: 过冲效果。
- **使用方法**: 将选定的 `Interpolator` 设置到 `ObjectAnimator` 或 `ValueAnimator` 上即可生效。
```java
ValueAnimator animator = ValueAnimator.ofInt(0, 100);
animator.setDuration(2000);
animator.setInterpolator(new BounceInterpolator()); // 使用弹跳效果
animator.addUpdateListener(valueAnimator -> {
int value = (int)valueAnimator.getAnimatedValue();
view.setX(value); // 更新视图位置
});
animator.start();
```
此代码片段演示了如何利用 `BounceInterpolator` 创建带有反弹效果的动画[^2]。
---
#### 三、TypeEvaluator 和 Interpolator 在各动画类中的应用
##### 1. ObjectAnimator
- **特点**: 继承自 `ValueAnimator` 并绑定具体的目标对象及其属性名称。
- **关联关系**: 如果需要处理非标准数据类型,则需指定对应的 `TypeEvaluator`;而 `Interpolator` 控制整体节奏感。
```java
ObjectAnimator animator = ObjectAnimator.ofObject(targetView, "customProperty",
new CustomEvaluator(), startPoint, endPoint);
animator.setInterpolator(new AccelerateInterpolator());
animator.start();
```
此处展示的是针对某个特定属性 `"customProperty"` 应用了定制化评估器以及加速型差值器的情况[^4]。
##### 2. ValueAnimator
- **独立运行**: 不依赖于任何 UI 元素,仅负责数值的变化过程。
- **灵活性高**: 支持多种输入参数形式(如整数数组、浮点列表等)并可附加任意数量的关键帧更新监听器。
```java
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(500);
animator.setEvaluator(new FloatEvaluator());
animator.setInterpolator(new AnticipateOvershootInterpolator());
animator.addUpdateListener(animation -> Log.d("TAG", String.valueOf(animation.getAnimatedValue())));
animator.start();
```
这段脚本说明了当只关心某些抽象变量随时间演化的轨迹而不涉及实际界面组件操作的时候该如何配置相关选项。
##### 3. PropertyValuesHolder
- **多属性同步修改工具**: 单独封装每条路径上的变动细节以便组合成更复杂的视觉表现形式。
- **集成优势明显**: 同时调整多个维度无需额外管理协调工作量。
```java
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(View.TRANSLATION_X, 0f, 200f);
PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat(View.ALPHA, 1f, 0f);
ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(imageView, pvhX, pvhAlpha);
anim.setDuration(800);
anim.setInterpolator(new CycleInterpolator(2)); // 循环两次
anim.start();
```
这里体现了借助 `PropertyValuesHolder` 如何轻松达成位移加透明度双重转变的效果,并且引入周期性的波动行为作为装饰点缀.
##### 4. AnimatorSet
- **序列化/并发播放机制**: 提供灵活手段安排若干子项按照预定顺序或者平行方式进行展现活动。
- **增强交互体验**: 对应不同的触发条件能够迅速切换状态呈现给用户直观反馈信息。
```java
AnimatorSet set = new AnimatorSet();
ObjectAnimator moveIn = ObjectAnimator.ofFloat(view, View.X, 0f, 300f);
moveIn.setDuration(700);
moveIn.setInterpolator(new AccelerateInterpolator());
ObjectAnimator fadeIn = ObjectAnimator.ofFloat(view, View.ALPHA, 0f, 1f);
fadeIn.setDuration(900);
fadeIn.setInterpolator(new DecelerateInterpolator());
set.playTogether(moveIn, fadeIn);
set.start();
```
以上实例表明怎样把两个单独的动作结合起来形成连贯的整体动作流程,同时各自保留独特的动态特性描述.
---
### 总结
无论是简单还是复杂的动画设计任务都可以依靠这些基础构件去完成。合理选用合适的估值策略配合恰当的时间函数可以让整个项目显得更加生动有趣。
阅读全文
相关推荐


















