android 插值器和估值器学习 备忘

本文探讨了动画插值器的工作原理,即如何通过改变动画进度百分比来调整动画速度,并介绍了估值器如何根据这一百分比计算出改变后的属性值。通过具体的实例解释了插值器与估值器在动画实现中的作用。

插值器返回一个   根据时间流逝的百分比计算出当前属性值改变的百分比。

估值器用来:根据当前属性改变的百分比来计算改变后的属性值


例子:对于一个匀速,加速的插值器,即可直接使用匀速、加速插值器来实现,也可通过继承TypeEvaluator类重写方法来实现。

个人理解:插值器通过改变当前动画进行百分比来改变动画进行时的快慢,而具体动画的运行轨迹通过估值器来实现。

估值器的fraction  是由插值器给出的。

<think>好的,我现在需要帮助用户理解Android中的插值器(Interpolator)估值(TypeEvaluator)的使用方法原理。首先,我得回顾一下用户提供的引用内容,确保信息准确。 用户提到了几个引用,其中引用1到5解释了插值器估值的作用。比如,引用3详细说明了插值器的作用是根据时间流逝计算属性变化的比例,而引用45则展示了如何自定义估值插值器的代码示例。用户的问题主要集中在两者的使用实现原理,所以需要分步骤解释。 首先,我应该定义什么是插值器估值插值器负责控制动画的变化速率,比如匀速、加速或弹跳效果。而估值则决定属性值如何从起始值过渡到结束值,适用于系统无法识别的类型。 接下来,需要说明系统内置的插值器,如LinearInterpolatorBounceInterpolator,并举例说明它们的效果。然后,讲解如何自定义插值器,比如用户提供的MyInterpolator类,重写getInterpolation方法。 对于估值,系统支持int、float颜色类型,分别由对应的评估程序处理。当需要处理其他类型时,比如用户提到的Integer,可以通过实现TypeEvaluator接口,重写evaluate方法,如NumEvaluator示例。 然后,需要将两者在动画中的协同工作流程解释清楚:插值器计算时间比例,估值根据该比例计算具体属性值。最后,给出一个完整的自定义动画示例,结合自定义的插值器估值,展示如何在代码中使用它们。 同时,要确保回答结构清晰,分点说明,并引用提供的参考资料。比如,在解释插值器时引用35,估值部分引用14。最后生成相关问题,帮助用户进一步学习。 检查是否有遗漏点,比如是否需要提到TypeEvaluator的泛型使用,或者动画的应用场景。确保代码示例正确,符合LaTeX格式要求,行内公式用$...$,独立公式用$$...$$,虽然当前问题可能不需要数学公式,但如果有涉及的话需注意。 总结步骤:定义两者,分述各自的作用、系统内置实现、自定义方法,协同工作流程,代码示例,相关问题。这样用户能够逐步理解并应用它们。</think>### Android 插值器(Interpolator)与估值(TypeEvaluator)原理与实现 #### 一、核心概念 1. **插值器(Interpolator)** 控制**动画变化速率**的时序函数,通过时间流逝比例(`input ∈ [0,1]`)计算**属性变化比例**。例如: - 线性插值器:$f(input) = input$,时间与进度同步[^3] - 弹跳插值器:通过数学函数模拟弹跳效果(如引用5中的`MyInterpolator`) 2. **估值(TypeEvaluator)** 根据插值器的输出比例,**计算具体属性值**。例如: - 系统内置:`IntEvaluator`、`FloatEvaluator`、`ArgbEvaluator` - 自定义:实现`evaluate(float fraction, T startValue, T endValue)`方法[^1] #### 二、插值器使用与自定义 1. **系统内置插值器** ```xml android:interpolator="@android:anim/linear_interpolator" ``` - 线性(`LinearInterpolator`):匀速动画 - 弹性(`BounceInterpolator`):模拟物理反弹 2. **自定义插值器** 继承`BaseInterpolator`并重写`getInterpolation`方法: ```java public class MyInterpolator implements Interpolator { @Override public float getInterpolation(float input) { return (float)(Math.pow(2, -10*input) * Math.sin((input-0.15/4)*(2*Math.PI)/0.15) +1); } } ``` 此示例通过指数函数正弦波实现阻尼振荡效果[^5] #### 三、估值使用与自定义 1. **系统默认行为** - 类型匹配:若属性为`int/float/color`,自动选择对应估值 - 示例:`ObjectAnimator.ofFloat(view, "alpha", 0f, 1f)` 2. **自定义估值** 实现`TypeEvaluator<T>`接口: ```java public class PointEvaluator implements TypeEvaluator<Point> { @Override public Point evaluate(float fraction, Point start, Point end) { int x = (int)(start.x + fraction*(end.x - start.x)); int y = (int)(start.y + fraction*(end.y - start.y)); return new Point(x, y); } } ``` 此示例实现`Point`对象的线性插值[^4] #### 四、协同工作流程 1. **动画执行步骤** - 步骤1:时间流逝 → 插值器计算`fraction` - 步骤2:`fraction` → 估值计算具体属性值 - 步骤3:更新视图属性 2. **数学关系** 若动画时长为$T$,当前时间$t$,则: $$ fraction = Interpolator.getInterpolation(t/T) $$ 最终属性值: $$ value = Evaluator.evaluate(fraction, startValue, endValue) $$ #### 五、完整实现示例 ```java // 自定义插值器(加速后减速) public class CustomInterpolator implements Interpolator { @Override public float getInterpolation(float input) { return (float)(Math.cos((input + 1)*Math.PI)/2 + 0.5); } } // 自定义颜色估值 public class ColorEvaluator implements TypeEvaluator<Integer> { @Override public Integer evaluate(float fraction, Integer start, Integer end) { int startA = (start >> 24) & 0xff; int startR = (start >> 16) & 0xff; int startG = (start >> 8) & 0xff; int startB = start & 0xff; int endA = (end >> 24) & 0xff; int endR = (end >> 16) & 0xff; int endG = (end >> 8) & 0xff; int endB = end & 0xff; return (startA + (int)(fraction*(endA - startA))) << 24 | (startR + (int)(fraction*(endR - startR))) << 16 | (startG + (int)(fraction*(endG - startG))) << 8 | (startB + (int)(fraction*(endB - startB))); } } // 使用示例 ObjectAnimator anim = ObjectAnimator.ofObject(view, "backgroundColor", new ColorEvaluator(), Color.RED, Color.BLUE); anim.setInterpolator(new CustomInterpolator()); anim.setDuration(1000).start(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值