Interpolator — o que é, curvas de interpolação no Android

Autor: IT Sectr Publicado: 2026-03-02 Tempo de leitura: 8 min
Interpolator — um componente do Android Animation Framework que define a curva matemática de mudança do valor da animação ao longo do tempo. Em vez de movimento linear (um objeto se move a velocidade constante), o Interpolator permite acelerar, desacelerar ou alterar ciclicamente a animação, criando um comportamento natural. O Android fornece 9 interpoladores incorporados: AccelerateInterpolator, DecelerateInterpolator, AccelerateDecelerateInterpolator, AnticipateInterpolator, OvershootInterpolator, BounceInterpolator, CycleInterpolator, LinearInterpolator e PathInterpolator. De acordo com a Documentação do Desenvolvedor Android, o uso de Interpolator não linear reduz o tempo de animação percebido em 25–40% — o usuário percebe a resposta como mais suave e responsiva. Na IT Sectr usamos AccelerateDecelerateInterpolator para aparecimento de elementos e OvershootInterpolator para botões de ação.

Pontos Principais

  • Interpolator — uma função matemática que transforma o progresso linear da animação (0→1) em uma curva de velocidade não linear.
  • 9 interpoladores incorporados no Android: de Linear a Bounce — cobrem 90% dos cenários típicos de animação.
  • PathInterpolator (API 21+) permite especificar uma curva Bezier arbitrária com dois pontos de controle.
  • TimeInterpolator — uma interface para criar interpoladores personalizados com o método getInterpolation().
  • AccelerateDecelerateInterpolator — uma curva simétrica: aceleração no início, desaceleração no final, a escolha mais universal.

O que é Interpolator?

Interpolator — uma interface no Android que mapeia o valor fracionário do progresso da animação (de 0.0 a 1.0) para um valor real com velocidade modificada. Se uma animação dura 300 milissegundos, o sistema chama o Interpolator para cada quadro, passando o progresso atual. O Interpolator retorna um valor modificado — por exemplo, com AccelerateInterpolator a 50% do tempo a animação percorreu apenas ~25% do caminho, simulando aceleração.

Matematicamente, o Interpolator pode ser representado como uma função f(t), onde t é o tempo normalizado [0, 1], e f(t) é o valor normalizado [0, 1] (ou mais amplo para Overshoot/Bounce). LinearInterpolator retorna f(t) = t — o objeto se move a velocidade constante. AccelerateInterpolator aproxima f(t) = t², DecelerateInterpolator aproxima f(t) = 1 − (1 − t)², criando um início ou fim suave. No Android Animation Framework, o Interpolator é aplicado tanto ao ValueAnimator quanto ao ObjectAnimator e ViewPropertyAnimator, fornecendo uma abordagem unificada para controle de velocidade em todos os níveis.

Interpoladores incorporados do Android

O Android oferece 9 interpoladores incorporados, cada um com seu próprio modelo matemático. A escolha do interpolador determina o caráter da animação: fisicalidade (Bounce), elasticidade (Overshoot) ou suavidade (AccelerateDecelerate).

Interpolador Matemática Caso de uso
LinearInterpolator f(t) = t Indicadores de progresso, texto rolante
AccelerateInterpolator f(t) = tⁿ (n=2) Elemento saindo da tela, aparecendo de baixo
DecelerateInterpolator f(t) = 1 − (1 − t)ⁿ Objeto caindo, entrando de cima com desaceleração
AccelerateDecelerateInterpolator Aproximação cos Universal, aparecimento/desaparecimento de elementos
AnticipateInterpolator Cúbica com recuo Entrada elástica — objeto recua ligeiramente antes de começar
OvershootInterpolator Cúbica com ultrapassagem Botão de ação — ultrapassa ligeiramente a posição alvo
AnticipateOvershootInterpolator Combinação de Anticipate + Overshoot Cartões — recuo + ultrapassagem com retorno
BounceInterpolator Ressaltos amortecidos Bola, elemento caindo sobre uma superfície
PathInterpolator Bezier cúbica (2 pontos de controle) Curvas personalizadas para sistema de design

Cada interpolador tem uma declaração XML em res/interpolator/ e uma classe Kotlin no pacote android.view.animation. AccelerateDecelerateInterpolator é o mais usado: sua curva se assemelha à função de easing ease-in-out em CSS. Para aplicativos Android com Material Design, recomenda-se OvershootInterpolator para botões de ação flutuante (FAB) — ele cria um efeito de "ressalto" ao aparecer.

PathInterpolator: curvas personalizadas

PathInterpolator — um interpolador baseado em uma curva Bezier, definido através de um objeto Path. Disponível desde a API 21 (Android 5.0). Permite projetar visualmente a curva de velocidade — o designer desenha a curva, o desenvolvedor a transfere para o código através de coordenadas de pontos de controle. Apenas Bezier cúbica é suportada (dois pontos de controle C1, C2).

A curva do PathInterpolator sempre começa no ponto (0,0) e termina em (1,1). Os pontos de controle definem a forma: (x1, y1) — o ponto inicial, (x2, y2) — o ponto final. Os valores de x devem estar no intervalo [0,1] — isso garante monotonicidade ao longo do tempo. Os valores de y podem sair de [0,1] — isso cria um efeito de ultrapassagem ou antecipação. Por exemplo, o Material Design padrão usa a curva fast-out-slow-in com pontos de controle (0.4, 0.0, 0.2, 1.0). Na IT Sectr construímos PathInterpolators personalizados para cada sistema de design — isso garante animações consistentes em todas as telas.

Criando seu próprio Interpolator

Se os interpoladores incorporados não cobrirem seu cenário, o Android permite criar um personalizado implementando a interface TimeInterpolator. O único método é getInterpolation(input: Float): Float. Input é o progresso atual da animação de 0 a 1; output é o valor modificado. Output pode sair de [0,1] para efeitos de ultrapassagem ou ressalto.

Interpoladores personalizados típicos: efeito de ressalto amortecido (indo acima de 1.0 e retornando), efeito elástico (amortecimento senoidal), interpolador de passo (saltos discretos). Interpoladores personalizados também podem ser definidos via XML usando a tag <interpolator> e especificando a classe. O Android Studio tem uma prévia incorporada do Interpolator no Layout Inspector — ela mostra a curva real para o interpolador selecionado, simplificando a depuração.

Exemplos de código em Kotlin

Exemplo 1: AccelerateDecelerateInterpolator com ValueAnimator

Animação básica de escala de botão usando um interpolador simétrico. ValueAnimator altera o valor de 1.0 para 1.2 e vice-versa, e AccelerateDecelerateInterpolator torna o movimento 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 cria aceleração suave no início e desaceleração suave no final. O modo REVERSE repete a animação na direção oposta, criando um efeito de pulsação. Este padrão é usado para botões de ação, atraindo a atenção do usuário para um elemento-chave da interface.

Exemplo 2: PathInterpolator com curva personalizada

Curva personalizada com efeito de ultrapassagem — o objeto ultrapassa a posição alvo em 10% e retorna. Os pontos de controle (0.4, 0.0, 0.6, 1.3) definem entrada acelerada com ultrapassagem.

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 aceita um Path com uma curva Bezier cúbica. No exemplo, o elemento "ultrapassa" a posição alvo (y=1.3 a 60% do tempo) e retorna à posição final. O Path deve ser estritamente monótono ao longo do eixo x, caso contrário a animação irá para trás. Para verificação, use Layout Inspector no Android Studio.

Exemplo 3: BounceInterpolator personalizado

Interpolador personalizado com efeito de ressalto amortecido. Implementação via TimeInterpolator com quatro ciclos de amortecimento.

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)
    }
}

O DampedBounceInterpolator personalizado cria 4 ressaltos amortecidos com um coeficiente de amortecimento de 0.85. O método getInterpolation recebe uma entrada linear e retorna um valor com efeito de "mola". Na IT Sectr usamos este interpolador para animação de aparecimento de notificações — o ressalto cria uma sensação de fisicalidade e atrai a atenção.

Perguntas Frequentes

Como o AccelerateDecelerateInterpolator difere do PathInterpolator?

AccelerateDecelerateInterpolator cria uma curva simétrica — o objeto acelera no início e desacelera no final. PathInterpolator permite especificar uma curva arbitrária através de Path com um ponto de controle (Bezier cúbica). Para animações personalizadas com comportamento assimétrico (por exemplo, início rápido + final lento), use PathInterpolator com pontos de controle (0.2, 0.8, 0.4, 1.0).

Posso criar meu próprio Interpolator no Android?

Sim, implemente a interface TimeInterpolator e sobrescreva o método getInterpolation(input: Float): Float. Input é um valor fracionário de 0 a 1 (progresso da animação), output é o valor real. Por exemplo, um efeito de ressalto é implementado retornando valores maiores que 1 ou menores que 0 para comportamento elástico. Registre o interpolador através da tag XML ou use-o diretamente no código.

O PathInterpolator está disponível em todas as versões do Android?

PathInterpolator foi adicionado na API 21 (Android 5.0 Lollipop). Para versões antigas, use AccelerateDecelerateInterpolator ou um TimeInterpolator personalizado. PathInterpolator só suporta curvas Bezier cúbicas com dois pontos de controle — linhas retas e curvas quadráticas podem produzir interpolação incorreta. Para compatibilidade reversa, use AccelerateDecelerateInterpolator como fallback.

Qual interpolador o Material Design recomenda?

Material Design 3 recomenda a curva fast-out-slow-in com pontos de controle (0.4, 0.0, 0.2, 1.0) para aparecimento de elementos, linear-out-slow-in (0.0, 0.0, 0.2, 1.0) para desaparecimento e fast-out-linear-in (0.4, 0.0, 1.0, 1.0) para movimento. No Android, essas curvas estão implementadas na classe FastOutSlowInInterpolator da biblioteca Material Components.

O Interpolator afeta o desempenho da animação?

Minimamente. Os interpoladores incorporados realizam uma operação matemática por quadro — a sobrecarga é insignificante. Interpoladores personalizados com cálculos pesados (trigonometria, loops) podem causar micro-jank em dispositivos fracos. Otimize pré-calculando valores no construtor ou use TimeInterpolator com cache.

Resumo

  • Interpolator — uma função matemática que transforma o progresso linear da animação em uma curva de velocidade não linear, tornando o movimento natural.
  • 9 interpoladores incorporados do Android cobrem 90% dos cenários — desde movimento linear até ressaltos físicos.
  • PathInterpolator (API 21+) define uma curva Bezier personalizada com dois pontos de controle para controle preciso da animação.
  • TimeInterpolator — uma interface para criar interpoladores personalizados com matemática arbitrária.
  • Material Design recomenda fast-out-slow-in para aparecimento, linear-out-slow-in para desaparecimento de elementos.
  • AccelerateDecelerateInterpolator — uma escolha universal para animações simétricas com início e fim suaves.
  • Interpoladores personalizados com ressaltos amortecidos criam comportamento físico para notificações e elementos interativos.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também