Interpolator — qué es, curvas de interpolación en Android

Autor: IT Sectr Publicado: 2026-03-02 Tiempo de lectura: 8 min
Interpolator — un componente del Android Animation Framework que define la curva matemática de cambio del valor de animación en el tiempo. En lugar de movimiento lineal (un objeto se mueve a velocidad constante), Interpolator permite acelerar, desacelerar o cambiar cíclicamente la animación, creando un comportamiento natural. Android proporciona 9 interpoladores incorporados: AccelerateInterpolator, DecelerateInterpolator, AccelerateDecelerateInterpolator, AnticipateInterpolator, OvershootInterpolator, BounceInterpolator, CycleInterpolator, LinearInterpolator y PathInterpolator. Según la Documentación para Desarrolladores de Android, el uso de Interpolator no lineal reduce el tiempo de animación percibido en un 25–40% — el usuario percibe la respuesta como más suave y receptiva. En IT Sectr usamos AccelerateDecelerateInterpolator para la aparición de elementos y OvershootInterpolator para botones de acción.

Puntos Clave

  • Interpolator — una función matemática que transforma el progreso lineal de la animación (0→1) en una curva de velocidad no lineal.
  • 9 interpoladores incorporados en Android: desde Linear hasta Bounce — cubren el 90% de los escenarios típicos de animación.
  • PathInterpolator (API 21+) permite especificar una curva Bezier arbitraria con dos puntos de control.
  • TimeInterpolator — una interfaz para crear interpoladores personalizados con el método getInterpolation().
  • AccelerateDecelerateInterpolator — una curva simétrica: aceleración al inicio, desaceleración al final, la opción más universal.

¿Qué es Interpolator?

Interpolator — una interfaz en Android que asigna el valor fraccionario del progreso de la animación (de 0.0 a 1.0) a un valor real con velocidad modificada. Si una animación dura 300 milisegundos, el sistema llama a Interpolator para cada fotograma, pasando el progreso actual. El Interpolator devuelve un valor modificado — por ejemplo, con AccelerateInterpolator al 50% del tiempo la animación solo ha recorrido ~25% del camino, simulando aceleración.

Matemáticamente, Interpolator se puede representar como una función f(t), donde t es el tiempo normalizado [0, 1], y f(t) es el valor normalizado [0, 1] (o más amplio para Overshoot/Bounce). LinearInterpolator devuelve f(t) = t — el objeto se mueve a velocidad constante. AccelerateInterpolator aproxima f(t) = t², DecelerateInterpolator aproxima f(t) = 1 − (1 − t)², creando un inicio o final suave. En Android Animation Framework, Interpolator se aplica tanto a ValueAnimator como a ObjectAnimator y ViewPropertyAnimator, proporcionando un enfoque unificado para el control de velocidad en todos los niveles.

Interpoladores incorporados de Android

Android ofrece 9 interpoladores incorporados, cada uno con su propio modelo matemático. La elección del interpolador determina el carácter de la animación: fisicalidad (Bounce), elasticidad (Overshoot) o suavidad (AccelerateDecelerate).

Interpolador Matemática Caso de uso
LinearInterpolator f(t) = t Indicadores de progreso, texto marquesina
AccelerateInterpolator f(t) = tⁿ (n=2) Elemento saliendo de la pantalla, apareciendo desde abajo
DecelerateInterpolator f(t) = 1 − (1 − t)ⁿ Objeto cayendo, entrando desde arriba con desaceleración
AccelerateDecelerateInterpolator Aproximación coseno Universal, aparición/desaparición de elementos
AnticipateInterpolator Cúbica con retroceso Entrada elástica — el objeto retrocede ligeramente antes de comenzar
OvershootInterpolator Cúbica con sobrepaso Botón de acción — sobrepasa ligeramente la posición objetivo
AnticipateOvershootInterpolator Combinación de Anticipate + Overshoot Tarjetas — retroceso + sobrepaso con retorno
BounceInterpolator Rebotes amortiguados Pelota, elemento cayendo sobre una superficie
PathInterpolator Bezier cúbica (2 puntos de control) Curvas personalizadas para sistema de diseño

Cada interpolador tiene una declaración XML en res/interpolator/ y una clase Kotlin en el paquete android.view.animation. AccelerateDecelerateInterpolator es el más utilizado: su curva se asemeja a la función de easing ease-in-out en CSS. Para aplicaciones Android con Material Design, se recomienda OvershootInterpolator para botones de acción flotante (FAB) — crea un efecto de "rebote" al aparecer.

PathInterpolator: curvas personalizadas

PathInterpolator — un interpolador basado en una curva Bezier, definido mediante un objeto Path. Disponible desde API 21 (Android 5.0). Permite diseñar visualmente la curva de velocidad — el diseñador dibuja la curva, el desarrollador la traslada al código mediante coordenadas de puntos de control. Solo se admite Bezier cúbica (dos puntos de control C1, C2).

La curva de PathInterpolator siempre comienza en el punto (0,0) y termina en (1,1). Los puntos de control definen la forma: (x1, y1) — el punto inicial, (x2, y2) — el punto final. Los valores de x deben estar en el rango [0,1] — esto garantiza la monotonicidad en el tiempo. Los valores de y pueden salir de [0,1] — esto crea un efecto de sobrepaso (overshoot) o anticipación. Por ejemplo, el Material Design estándar usa la curva fast-out-slow-in con puntos de control (0.4, 0.0, 0.2, 1.0). En IT Sectr construimos PathInterpolators personalizados para cada sistema de diseño — esto garantiza animaciones consistentes en todas las pantallas.

Crear tu propio Interpolator

Si los interpoladores incorporados no cubren tu escenario, Android permite crear uno personalizado implementando la interfaz TimeInterpolator. El único método es getInterpolation(input: Float): Float. Input es el progreso actual de la animación de 0 a 1; output es el valor modificado. Output puede salir de [0,1] para efectos de sobrepaso o rebote.

Interpoladores personalizados típicos: efecto de rebote amortiguado (superando 1.0 y regresando), efecto elástico (amortiguación sinusoidal), interpolador de pasos (saltos discretos). Los interpoladores personalizados también se pueden definir mediante XML usando la etiqueta <interpolator> y especificando la clase. Android Studio tiene una vista previa incorporada de Interpolator en Layout Inspector — muestra la curva real para el interpolador seleccionado, simplificando la depuración.

Ejemplos de código en Kotlin

Ejemplo 1: AccelerateDecelerateInterpolator con ValueAnimator

Animación básica de escala de botón usando un interpolador simétrico. ValueAnimator cambia el valor de 1.0 a 1.2 y viceversa, y AccelerateDecelerateInterpolator hace que el movimiento sea suave.

kotlin
import android.animation.ValueAnimator
import android.view.animation.AccelerateDecelerateInterpolator
import android.view.View

fun View.pulseAnimation() {
    ValueAnimator.ofFloat(1.0f, 1.2f).apply {
        duration = 300
        interpolator = AccelerateDecelerateInterpolator()
        repeatCount = 1
        repeatMode = ValueAnimator.REVERSE

        addUpdateListener { animator ->
            val scale = animator.animatedValue as Float
            this@pulseAnimation.scaleX = scale
            this@pulseAnimation.scaleY = scale
        }

        start()
    }
}

AccelerateDecelerateInterpolator crea una aceleración suave al principio y una desaceleración suave al final. El modo REVERSE repite la animación en dirección opuesta, creando un efecto de pulsación. Este patrón se usa para botones de acción, atrayendo la atención del usuario hacia un elemento clave de la interfaz.

Ejemplo 2: PathInterpolator con curva personalizada

Curva personalizada con efecto de sobrepaso — el objeto sobrepasa la posición objetivo en un 10% y regresa. Los puntos de control (0.4, 0.0, 0.6, 1.3) definen una entrada acelerada con sobrepaso.

kotlin
import android.animation.ObjectAnimator
import android.graphics.Path
import android.view.animation.PathInterpolator
import android.view.View

fun View.slideWithOvershoot() {
    val path = Path().apply {
        cubicTo(0.4f, 0.0f, 0.6f, 1.3f, 1.0f, 1.0f)
    }
    val interpolator = PathInterpolator(path)

    ObjectAnimator.ofFloat(this, "translationY", 200f, 0f).apply {
        duration = 400
        interpolator = interpolator
        start()
    }
}

PathInterpolator acepta un Path con una curva Bezier cúbica. En el ejemplo, el elemento "sobrepasa" la posición objetivo (y=1.3 al 60% del tiempo) y regresa a la posición final. El Path debe ser estrictamente monótono en el eje x, de lo contrario la animación irá hacia atrás. Para verificación, usa Layout Inspector en Android Studio.

Ejemplo 3: BounceInterpolator personalizado

Interpolador personalizado con efecto de rebote amortiguado. Implementación mediante TimeInterpolator con cuatro ciclos de amortiguación.

kotlin
import android.animation.TimeInterpolator

class DampedBounceInterpolator : TimeInterpolator {

    private val cycles = 4
    private val damping = 0.85f

    override fun getInterpolation(input: Float): Float {
        val t = input * cycles
        val decay = Math.pow(damping.toDouble(), cycles.toDouble()).toFloat()
        val peak = t - (Math.floor(t.toDouble())).toFloat()
        val bounce = Math.sin(peak * Math.PI).toFloat()
        return 1f - bounce * decay * (1f - input)
    }
}

DampedBounceInterpolator personalizado crea 4 rebotes amortiguados con un coeficiente de amortiguación de 0.85. El método getInterpolation toma una entrada lineal y devuelve un valor con efecto de "resorte". En IT Sectr usamos este interpolador para la animación de aparición de notificaciones — el rebote crea una sensación de fisicalidad y atrae la atención.

Preguntas Frecuentes

¿En qué se diferencia AccelerateDecelerateInterpolator de PathInterpolator?

AccelerateDecelerateInterpolator crea una curva simétrica — el objeto acelera al principio y desacelera al final. PathInterpolator permite especificar una curva arbitraria mediante Path con un punto de control (Bezier cúbica). Para animaciones personalizadas con comportamiento asimétrico (por ejemplo, inicio rápido + final lento), usa PathInterpolator con puntos de control (0.2, 0.8, 0.4, 1.0).

¿Puedo crear mi propio Interpolator en Android?

Sí, implementa la interfaz TimeInterpolator y sobrescribe el método getInterpolation(input: Float): Float. Input es un valor fraccionario de 0 a 1 (progreso de la animación), output es el valor real. Por ejemplo, un efecto de rebote se implementa devolviendo valores mayores a 1 o menores a 0 para un comportamiento elástico. Registra el interpolador mediante la etiqueta XML o úsalo directamente en el código.

¿PathInterpolator está disponible en todas las versiones de Android?

PathInterpolator se añadió en API 21 (Android 5.0 Lollipop). Para versiones antiguas, usa AccelerateDecelerateInterpolator o un TimeInterpolator personalizado. PathInterpolator solo admite curvas Bezier cúbicas con dos puntos de control — las líneas rectas y curvas cuadráticas pueden producir interpolación incorrecta. Para compatibilidad inversa, usa AccelerateDecelerateInterpolator como alternativa.

¿Qué interpolador recomienda Material Design?

Material Design 3 recomienda la curva fast-out-slow-in con puntos de control (0.4, 0.0, 0.2, 1.0) para la aparición de elementos, linear-out-slow-in (0.0, 0.0, 0.2, 1.0) para desaparición y fast-out-linear-in (0.4, 0.0, 1.0, 1.0) para movimiento. En Android estas curvas están implementadas en la clase FastOutSlowInInterpolator de la biblioteca Material Components.

¿Afecta el Interpolator al rendimiento de la animación?

Mínimamente. Los interpoladores incorporados realizan una operación matemática por fotograma — la sobrecarga es insignificante. Los interpoladores personalizados con cálculos pesados (trigonometría, bucles) pueden causar micro-jank en dispositivos débiles. Optimiza precalculando valores en el constructor o usa TimeInterpolator con almacenamiento en caché.

Resumen

  • Interpolator — una función matemática que transforma el progreso lineal de la animación en una curva de velocidad no lineal, haciendo que el movimiento sea natural.
  • 9 interpoladores incorporados de Android cubren el 90% de los escenarios — desde movimiento lineal hasta rebotes físicos.
  • PathInterpolator (API 21+) define una curva Bezier personalizada con dos puntos de control para un control preciso de la animación.
  • TimeInterpolator — una interfaz para crear interpoladores personalizados con matemáticas arbitrarias.
  • Material Design recomienda fast-out-slow-in para la aparición, linear-out-slow-in para la desaparición de elementos.
  • AccelerateDecelerateInterpolator — una opción universal para animaciones simétricas con inicio y final suaves.
  • Los interpoladores personalizados con rebotes amortiguados crean un comportamiento físico para notificaciones y elementos interactivos.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también