Interpolador y estimador de animaciones

concepto

Interpolador

  • TimeInterpolator (interpolador de tiempo)

Calcule el porcentaje del cambio del valor del atributo actual en función del porcentaje de tiempo transcurrido

  • LinearInterpolator (interpolador lineal)

Utilizado para animación de velocidad uniforme

  • AccelerateDecelerateInterpolator (interpolador de aceleración / desaceleración)

La animación es lenta en ambos extremos y rápida en el medio.

  • DecelerateInterpolator (DecelerateInterpolator)

La animación es cada vez más lenta

Hay otros interpoladores incorporados en el sistema: CycleInterpolator (movimiento de ciclo), BounceInterpolator (efecto pinball de la etapa final), OvershootInterpolator (completa rápidamente la animación y regresa al estilo final después de exceder), AnticipateInterpolator (hacia atrás y luego acelera hacia adelante) , AnticipateOvershootInterpolator (primero Retirarse y luego acelerar hacia adelante, y luego regresar al final después de exceder el final)

Estimador

Tipo de algoritmo de estimación, es decir, estimador. Calcule el valor de atributo modificado de acuerdo con el porcentaje del cambio de atributo actual. Estimadores existentes en el sistema: IntEvaluator (para atributos enteros), FloatEvaluator (para atributos de punto flotante), ArgbEvaluator (para atributos de color)

Práctica

Interpolador personalizado

El interpolador personalizado necesita implementar la interfaz Interpolator / TimeInterpolator y anular el método getInterpolation (). La animación de interpolación implementa la interfaz Interpolator; la animación de atributos implementa la interfaz TimeInterpolator.

public interface Interpolator { 
   float getInterpolation(float input) {  
        // input值值变化范围是0-1,且随着动画进度(0% - 100% )均匀变化,即动画开始时,input值 = 0;动画结束时input = 1
        // 而中间的值则是随着动画的进度(0% - 100%)在0到1之间均匀增加
       return float型值;
   }
}
TimeInterpolator 接口同上

Ejemplo

Definir un interpolador de desaceleración y aceleración

// 减速加速插值器
class DecelerateAccelerateInterpolator : TimeInterpolator {
    override fun getInterpolation(input: Float): Float {
        return if (input < 0.5) (sin(Math.PI * input) / 2f).toFloat() else ((2 - sin(Math.PI * input)) / 2f).toFloat()
    }
}

// activity 中具体实现
private fun interlatorAni() {
        val animator = ObjectAnimator.ofFloat(tv_interpolator, "translationX", tv_interpolator.translationX,300f,tv_interpolator.translationX)
        animator.duration = 3000
        animator.interpolator = DecelerateAccelerateInterpolator()
        animator.start()
}

Estimador personalizado

Interfaz TypeEvaluator y anulación del método de evaluación ()

public interface TypeEvaluator<T> {
   // fraction 代表时间流逝的百分比
   public T evaluate(float fraction, T startValue, T endValue);
}

Ejemplo

Definir un estimador de trayectoria parabólica

// 建Point类用来保存坐标信息,Point对象即是我们要操作的对象
data class Point(val x: Float, val y: Float)

// 自定义估值算法 PointTypeEvaluator并制定泛型为Point类型,
// 在 evaluate方法 中进行估值算法,为point对象的x和y赋值并将该对象返回
class PointTypeEvaluator : TypeEvaluator<Point> {
    override fun evaluate(fraction: Float, startValue: Point?, endValue: Point?): Point {
        // fraction 代表时间流逝的百分比
        val x = startValue?.x?.plus(fraction * (endValue?.x!!.minus(startValue.x)))
        val y = startValue?.y?.plus(fraction * (endValue?.y!!.minus(startValue.y)))
        return Point(x!!, y!!)
    }
}

// activity 中具体实现
 private fun clickLine() {
 
       // 调用 ValueAnimator.ofObject() 方法获得 ValueAnimator 对象,并传入 自定义估值器对象 和 Point的初始对象与终止对象
        val animator = ValueAnimator.ofObject(PointTypeEvaluator(), Point(0f, 0f), Point(300f, 300f))
        animator.duration = 3000
        
        // 线性插值器
        animator.interpolator = LinearInterpolator()
        
        // 设置 AnimatorUpdateListener 监听
        animator.addUpdateListener { ValueAnimator ->
            //可获得在估值算法中返回的Point对象,并为小球设置新的x和y值
            val point = ValueAnimator.animatedValue as Point
            iv_ball.x = point.x
            iv_ball.y = point.y
        }
        animator.start()
    }

resumen

TimeInterpolator y TypeEvaluator son medios importantes para realizar animaciones de velocidad no uniforme. La animación del atributo es para animar el atributo. Para realizar la animación, el Interpolador de tiempo (interpolador) primero calcula el porcentaje del cambio del valor del atributo actual de acuerdo con el porcentaje de tiempo transcurrido, y el interpolador devuelve este porcentaje. En este momento, el trabajo de el interpolador está completo. Esto requiere que el estimador calcule el valor del atributo cambiado de acuerdo con el porcentaje del cambio de atributo actual. De acuerdo con este valor de atributo, podemos establecer el valor del atributo actual.

Supongo que te gusta

Origin blog.csdn.net/xufei5789651/article/details/101068494
Recomendado
Clasificación