Vibração no Android: como controlar frequência e amplitude (Kotlin)

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que controlar a vibração no Android? De "ding" a uma obra-prima tátil

\n\n

Você já se perguntou por que alguns aplicativos vibram de forma agradável e precisa, enquanto outros parecem uma furadeira do vizinho? Tudo se resume à frequência e amplitude da vibração. No Stack Overflow, a pergunta "How to make an Android device vibrate with different frequency?" acumulou milhares de visualizações — e não é por acaso. Desenvolvedores não querem apenas "ligar a vibração", mas criar um feedback tátil significativo: um toque leve, um sinal de alarme pulsante ou a simulação do pressionamento de um botão mecânico.

\n\n

Neste artigo, vamos explorar como controlar a vibração no Android usando Kotlin. Você aprenderá quais APIs existem, como elas evoluíram do Android 8 ao Android 14 e qual abordagem escolher para o seu projeto. Vamos lá!

\n\n

Uma breve viagem pela história: do Vibrator ao VibratorManager

\n\n

Por muito tempo, os desenvolvedores Android usavam a classe Vibrator e o método vibrate(long milliseconds). Simples, mas limitado: nenhum controle sobre a frequência. Com o Android 8 (API 26), o Google apresentou o VibrationEffect — uma ferramenta poderosa para criar padrões de vibração complexos. Já no Android 12 (API 31), foi adicionado o VibratorManager, que permite gerenciar vários vibradores (por exemplo, em dispositivos dobráveis).

\n\n

Hoje, temos três abordagens principais:

\n
    \n
  • Vibrator + VibrationEffect (API 26+) — básico, mas flexível.
  • \n
  • VibratorManager (API 31+) — moderno, para dispositivos com múltiplos vibradores.
  • \n
  • Vibrator.vibrate() obsoleto — apenas para compatibilidade reversa.
  • \n
\n\n

Vamos focar nas duas primeiras, pois elas oferecem controle sobre frequência e amplitude.

\n\n

Preparação: permissão para vibrar

\n\n

Antes de iniciar um "terremoto", não se esqueça de adicionar a permissão no AndroidManifest.xml:

\n
<uses-permission android:name="android.permission.VIBRATE" />
\n\n

Sem ela, seu código será simplesmente ignorado — sem erros, mas também sem vibração.

\n\n

Método 1: VibrationEffect — controle de frequência e amplitude (API 26+)

\n\n

A classe VibrationEffect permite criar vibração com frequência definida (através da amplitude) e duração. A frequência no Android não é definida diretamente em hertz — em vez disso, usa-se a amplitude (0–255), que é convertida pelo hardware em frequência. Quanto maior a amplitude, mais intensa a vibração.

\n\n

Vibração simples com amplitude

\n\n
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator\n\n// Vibração de 500 ms com amplitude máxima (255)\nval effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)\nvibrator.vibrate(effect)
\n\n

Vibração com frequência (amplitude) diferente

\n\n

Quer uma vibração fraca? Defina a amplitude como 50:

\n
val weakVibration = VibrationEffect.createOneShot(300, 50)\nvibrator.vibrate(weakVibration)
\n\n

Amplitude 255 é a máxima, 1 é quase imperceptível. Experimente!

\n\n

Padrões: vibração com pausas

\n\n

Às vezes, você não quer apenas um "ding", mas uma pulsação. Use createWaveform:

\n
val timings = longArrayOf(0, 200, 100, 300)  // pausa, vibração, pausa, vibração\nval amplitudes = intArrayOf(0, 200, 0, 150)  // amplitude para cada etapa\n\nval pattern = VibrationEffect.createWaveform(timings, amplitudes, -1)  // -1 = não repetir\nvibrator.vibrate(pattern)
\n\n

O primeiro elemento de timings é o atraso inicial. Geralmente, define-se como 0. amplitudes deve ter o mesmo comprimento. Se você passar null em vez do array de amplitudes, a amplitude máxima será usada em todas as etapas.

\n\n

Método 2: VibratorManager — para dispositivos modernos (API 31+)

\n\n

A partir do Android 12, é recomendado usar o VibratorManager

Blogs

Book Recommendations