Adicionar retorno tátil a eventos

Um dos casos de uso mais básicos para a resposta tátil é fornecer feedback sobre as interações do usuário. Seletores de horário, pressionamento de tecla em um teclado virtual e seleção de texto são exemplos comuns de bons casos de uso para o retorno tátil. Para mais informações sobre quando e como aplicar a tecnologia háptica, leia Princípios de design tátil.

Esta página descreve três maneiras de fornecer feedback tátil.

Esses métodos usam primitivas definidas no nível do dispositivo para fornecer feedback de alta qualidade personalizado para o dispositivo em questão.

Todos os métodos de feedback tátil respeitam as configurações de feedback tátil do usuário por padrão.

Usar componentes View para gerar feedback tátil

Use o método View.performHapticFeedback para gerar feedback tátil. As constantes táteis definidas pelo HapticFeedbackConstants são focadas na funcionalidade em um aplicativo, não no tipo de efeito tátil realizado.

A implementação pode variar dependendo dos recursos do dispositivo e do hardware, mas o app só precisa considerar o tipo de feedback a ser fornecido em um contexto específico. Ao se concentrar na funcionalidade, você pode ativar o feedback táctil para interações semelhantes. Os usuários aprendem a associar significados diferentes a diferentes sensações hápticas ao longo do tempo.

Pré-requisitos: ativar o retorno tátil

Enquanto o View estiver visível, o retorno tátil poderá ser usado para os eventos dele. Alguns eventos, como o toque longo, têm retorno tátil padrão que são acionados se um listener na visualização processar o evento (retorna true).

Um View do Android pode desativar o feedback tátil definindo a propriedade View.hapticFeedbackEnabled como false. A desativação dessa propriedade resulta em feedback padrão.

O método performHapticFeedback também respeita a configuração do sistema HAPTIC_FEEDBACK_ENABLED, que permite que o usuário desative todo o sistema.

Ao contrário de outras APIs hápticas, o uso de HapticFeedbackConstants com um View não exige a permissão VIBRATE.

Escolha uma HapticFeedbackConstant

Ao usar componentes View com HapticFeedbackConstants, não é necessário avaliar o suporte a dispositivos específicos, já que essas constantes terão comportamento de fallback, se necessário. A única consideração é o nível do SDK da constante desejada.

Exemplo 1: pressionamento de tecla

Este é um exemplo de como adicionar um feedback tátil a uma entrada de toque em View usando listeners de toque. Os efeitos simulam a sensação de pressionar e soltar um botão.

Kotlin

class HapticTouchListener : View.OnTouchListener {
  override fun onTouch(View view, MotionEvent event) : Boolean {
    when (event.actionMasked) {
      MotionEvent.ACTION_DOWN ->
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
      MotionEvent.ACTION_UP ->
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE)
    }
    return true
  }
}

Java

class HapticTouchListener implements View.OnTouchListener {
  @Override
  public boolean onTouch(View view, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
        break;
      case MotionEvent.ACTION_UP:
        view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE);
        break;
    }
    return true;
  }
}

Exemplo 2: botão "Enviar"

Os casos de uso de feedback tátil vão além da simulação de uma interação física com o dispositivo. Elas também podem ser usadas para transmitir um significado abstrato. Por exemplo, a expectativa geral para um efeito CONFIRM é uma vibração curta e leve, enquanto um REJECT pode ser um feedback mais forte para indicar falha. Isso é ilustrado no exemplo abaixo para um feedback do botão de envio.

Kotlin

submitButton.setOnClickListener { view ->
  val successful = performSubmit()
  if (successful) {
    view.performHapticFeedback(HapticFeedbackConstants.CONFIRM)
  } else {
    view.performHapticFeedback(HapticFeedbackConstants.REJECT)
  }
}

Java

submitButton.setOnClickListener(view -> {
  boolean successful = performSubmit();
  if (successful) {
    view.performHapticFeedback(HapticFeedbackConstants.CONFIRM);
  } else {
    view.performHapticFeedback(HapticFeedbackConstants.REJECT);
  }
});

Usar um VibrationEffect predefinido para gerar feedback tátil

O uso da abordagem baseada em View se concentra na interação do usuário. É preferível para manter a consistência em todo o sistema. No entanto, APIs VibrationEffect predefinidas específicas também podem ser invocadas para efeitos de resposta tátil personalizados.

Os efeitos predefinidos estão disponíveis como constantes VibrationEffect e podem ser verificados para suporte e reproduzidos com o serviço Vibrator, conforme mostrado nos exemplos abaixo.

Entender o suporte a dispositivos de APIs VibrationEffect

No uso básico, não é necessário verificar o suporte a APIs VibrationEffect individuais. As APIs como Vibrator.areEffectsSupported e Vibrator.areAllEffectsSupported são usadas para determinar se o dispositivo tem uma implementação personalizada da constante. Se um efeito personalizado não estiver presente, o app ainda poderá reproduzir os efeitos e usar uma implementação padrão definida pela plataforma.

Para mais detalhes, consulte VibrationEffect predefinidos.

Pré-requisitos: carregue o vibrador e a permissão VIBRATE

A maioria das vibrações pode ser reproduzida com o serviço Vibrator, que pode ser carregado da seguinte maneira:

Kotlin

import android.os.Vibrator

val vibrator = context.getSystemService(Vibrator::class.java)

Java

import android.os.Vibrator;

Vibrator vibrator = context.getSystemService(Vibrator.class);

O app precisa ter a permissão VIBRATE para fazer o dispositivo vibrar usando esse serviço. A permissão pode ser adicionada ao arquivo de manifesto do aplicativo:

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

Tocar um VibrationEffect predefinido

Os efeitos predefinidos podem ser preparados usando VibrationEffect.createPredefined e depois reproduzidos usando um dos métodos vibrate em Vibrator.

Este exemplo reproduz um efeito de clique.

Kotlin

val vibrator = context.getSystemService(Vibrator::class.java)
...
// Requires VIBRATE permission
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))

Java

Vibrator vibrator = context.getSystemService(Vibrator.class);
...
// Requires VIBRATE permission
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));

Usar composições avançadas com primitivas

A API VibrationEffect.Composition oferece mais possibilidades de feedback tátil. No entanto, ao contrário dos efeitos, essas primitivas não têm substitutos no nível do sistema, o que significa que é preciso prestar atenção nas primitivas e em outros recursos aceitos pelo dispositivo.

O uso dessas APIs é discutido em mais detalhes em Como criar efeitos táteis personalizados.