Usar gestos de pulso no Wear
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Os gestos de pulso permitem interações rápidas com o app, usando uma mão só,
quando não é possível tocar na tela.
Por exemplo, o usuário pode
rolar a tela de notificações com uma mão enquanto segura um copo de água com a
outra. Outros casos de uso para gestos de pulso incluem:
- Em um app de corrida, navegar pelas telas verticais que mostram o
número de passos, o tempo decorrido e o ritmo atual.
- Em um app de viagens, rolar a tela para conferir informações sobre o voo e portão de embarque.
- Em um app de notícias, rolar a tela para ler artigos.
Para testar os gestos de pulso de um relógio,
confira se os gestos estão
ativados em Configurações > Recursos avançados > Gestos > Gestos de
pulso ativados. Em seguida, selecione
Iniciar tutorial para concluir o tutorial sobre gestos no relógio.
Observação: balançar o pulso aciona a ação "voltar" ou "desfazer" em todo o sistema.
Esse gesto não pode ser personalizado de acordo com o app.
Os gestos de pulso podem ser usados das maneiras apresentadas abaixo, conforme descrito neste guia:
Cada gesto de pulso é mapeado para uma constante int
da classe
KeyEvent
,
conforme mostrado na tabela abaixo:
Usar um layout curvo para compatibilidade com gestos de pulso
A classe
WearableRecyclerView
inclui um layout em curva
para listas e oferece suporte a gestos de pulso
automaticamente. Ela tem ações predefinidas para
gestos de pulso realizados quando a visualização está em foco. Para mais informações sobre como usar
a classe WearableRecyclerView
, consulte Criar listas no Wear OS. Consulte também a seção
Práticas recomendadas deste guia.
Observação: a classe WearableRecyclerView
substitui uma classe semelhante, que foi
descontinuada na Biblioteca de Suporte de Wearables.
Mesmo que você use uma WearableRecyclerView
, recomendamos utilizar
constantes da classe
KeyEvent
. As ações predefinidas podem ser substituídas criando uma subclasse para
WearableRecyclerView
e implementando o callback
onKeyDown()
novamente. Esse comportamento pode ser totalmente desativado
usando setEnableGestureNavigation(false)
.
Para mais informações, consulte
Processar ações do teclado.
Usar eventos de teclas diretamente
Você pode usar eventos de teclas fora de uma
WearableRecyclerView
para acionar novas ações em resposta a eventos de
gesto. É importante ressaltar que esses eventos de gestos são reconhecidos quando o dispositivo está no
modo ativo e são entregues da mesma forma que todos os eventos de tecla.
Uma classe que responde à interação do usuário, como uma View
ou uma
Activity
, que implementa
KeyEvent.Callback
, pode ouvir eventos associados a gestos de pulso, assim como qualquer outro evento de tecla. O framework do Android
chama a View
ou a Activity
em foco
quando ocorre um evento de tecla. No caso de gestos, o callback do método onKeyDown()
é chamado.
Por exemplo, um app pode modificar ações predefinidas em uma View
ou Activity
que implemente KeyEvent.Callback
desta forma:
Kotlin
class GesturesActivity : Activity() {
/* KeyEvent.Callback */
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
return when (keyCode) {
KeyEvent.KEYCODE_NAVIGATE_NEXT ->
// Do something that advances a user View to the next item in an ordered list.
moveToNextItem()
KeyEvent.KEYCODE_NAVIGATE_PREVIOUS ->
// Do something that advances a user View to the previous item in an ordered list.
moveToPreviousItem()
else -> {
// If you did not handle it, let it be handled by the next possible element as determined
// by the Activity.
super.onKeyDown(keyCode, event)
}
}
}
/** Shows the next item in the custom list. */
private fun moveToNextItem(): Boolean {
...
// Return true if handled successfully, otherwise return false.
return false
}
/** Shows the previous item in the custom list. */
private fun moveToPreviousItem(): Boolean {
...
// Return true if handled successfully, otherwise return false.
return false
}
}
Java
public final class GesturesActivity extends Activity {
@Override /* KeyEvent.Callback */
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_NAVIGATE_NEXT:
// Do something that advances a user View to the next item in an ordered list.
return moveToNextItem();
case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:
// Do something that advances a user View to the previous item in an ordered list.
return moveToPreviousItem();
}
// If you did not handle it, let it be handled by the next possible element as determined by the Activity.
return super.onKeyDown(keyCode, event);
}
/** Shows the next item in the custom list. */
private boolean moveToNextItem() {
boolean handled = false;
...
// Return true if handled successfully, otherwise return false.
return handled;
}
/** Shows the previous item in the custom list. */
private boolean moveToPreviousItem() {
boolean handled = false;
...
// Return true if handled successfully, otherwise return false.
return handled;
}
}
Práticas recomendadas
- Revise as páginas
KeyEvent
e
KeyEvent.Callback
para entender como funciona a entrega de eventos de teclas para
View
e Activity
.
- Mantenha uma affordance direcional consistente: use "virar o pulso para fora" para
avançar e "virar o pulso para dentro" para voltar.
- Tenha um toque paralelo para um gesto.
- Forneça feedback visual.
- Não use códigos de tecla para implementar funcionalidades que
não sejam intuitivas em relação ao resto do sistema. Por exemplo, não use
KEYCODE_NAVIGATE_NEXT
para cancelar uma ação ou navegar de
um lado para o outro com movimentos de pulso.
- Elementos que não estão mostrados na interface do usuário,
como visualizações fora da tela ou parcialmente
cobertas, não podem interceptar os eventos de tecla. O mesmo vale para qualquer evento de tecla.
- Não reinterprete movimentos de pulso repetidos como um novo gesto.
Isso pode entrar em conflito com o gesto "balançar o pulso" do sistema.
Para que uma visualização receba eventos de tecla de gestos, ela precisa estar em
foco. Consulte
View.setFocusable()
.
Como os gestos são tratados como eventos de tecla,
eles acionam uma transição que sai do "modo de toque" e, por isso, podem iniciar ações inesperadas. Como os usuários podem alternar entre toques e
gestos, pode ser necessário usar o método
View::setFocusableInTouchmode()
. Em alguns
casos, também pode ser necessário usar
setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS)
para que,
quando o foco mudar ao entrar ou sair do "modo de toque", a
visualização volte para o foco.
- Use
requestFocus()
e
clearFocus()
com cuidado:
- Ao chamar
requestFocus()
, confira se
a visualização pode ser colocada em foco. Se ela estiver fora da tela ou coberta por outra,
podem ocorrer surpresas quando os gestos acionarem os callbacks.
- O
clearFocus()
inicia uma pesquisa de foco para encontrar outra
visualização adequada. Dependendo da hierarquia da visualização, essa pesquisa
pode exigir um nível de programação mais avançado. Ela também pode acabar atribuindo foco a uma
visualização inesperada.
Os eventos de tecla são mostrados primeiro na visualização em foco na
hierarquia. Se a visualização em foco não processar o evento (ou seja, retornar
false
), ele não será entregue à visualização mãe, mesmo
que possa receber foco e tenha um
KeyListener
. Em vez disso, o evento será entregue à atividade atual,
mantendo a hierarquia de visualização em foco.
Pode ser necessário
capturar todos os eventos de nível mais alto e, em seguida, transmitir os códigos relevantes.
Como alternativa, você pode criar uma subclasse para a atividade e modificar o
método
dispatchKeyEvent(KeyEvent event)
para interceptar as teclas
quando necessário ou processar os eventos de tecla quando isso não ocorrer
em níveis mais baixos.
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-07-26 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-07-26 UTC."],[],[],null,["# Use wrist gestures on Wear\n\nWrist gestures can enable quick, one-handed interactions with your app\nwhen a touch screen is inconvenient.\n\n\nFor example, a user can scroll\nthrough notifications with one hand while holding a cup of water with the\nother. Other use cases for wrist gestures include the following:\n\n- In a jogging app, navigating through vertical screens that show the steps taken, time elapsed, and current pace\n- In a travel app, scrolling through flight and gate information\n- In a news app, scrolling through articles\n\n\nTo review the [wrist gestures](https://support.google.com/androidwear/answer/6312406) on a watch\ndevice, confirm that gestures are\nturned on by selecting **Settings \\\u003e Advanced features \\\u003e Gestures \\\u003e Wrist Gestures\nOn** . Then complete the\nGestures tutorial on the watch by selecting **Launch Tutorial**.\n\n\n**Note:** Shaking the wrist is the system-wide back or undo gesture\nand is not available for apps to customize.\n\n\nWrist gestures can be used in the following ways, as described in this guide:\n\n- With a [curved layout](#using_wrv), which has predefined gesture actions\n- By using [key events directly](#using_key_events) to define new user actions\n\n\nEach wrist gesture is mapped to an `int` constant from the\n[KeyEvent](/reference/android/view/KeyEvent)\nclass, as shown in the following table:\n\n| Gesture | KeyEvent | Description |\n|-----------------|-------------------------------------------------------------------------------------------|------------------------------------------|\n| Flick wrist out | [`KEYCODE_NAVIGATE_NEXT`](/reference/android/view/KeyEvent#KEYCODE_NAVIGATE_NEXT) | This key code goes to the next item. |\n| Flick wrist in | [`KEYCODE_NAVIGATE_PREVIOUS`](/reference/android/view/KeyEvent#KEYCODE_NAVIGATE_PREVIOUS) | This key code goes to the previous item. |\n\nUse a curved layout to support wrist gestures\n---------------------------------------------\n\n\nThe [WearableRecyclerView](/reference/androidx/wear/widget/WearableRecyclerView) class provides a curved\nlayout for lists and automatically supports\nwrist gestures. The class has predefined actions for occurrences of\nwrist gestures when the view has focus. For information about using\nthe `WearableRecyclerView` class, see [Create lists on Wear OS](/training/wearables/ui/lists). Also, see the\n[Best practices](#best_practices) section of this guide.\n\n\n**Note:** The `WearableRecyclerView` class replaces a similar,\n[deprecated](/training/wearables/ui/wear-ui-library#deprecations) class in the Wearable Support Library.\n\n\nEven if you use a `WearableRecyclerView`, you might want to use\nconstants from the [KeyEvent](/reference/android/view/KeyEvent)\nclass. The predefined actions can be overridden by subclassing the\n`WearableRecyclerView` and re-implementing the\n`onKeyDown()` callback. The behavior can be disabled entirely\nby using [`setEnableGestureNavigation(false)`](/reference/android/support/wearable/view/WearableListView#setEnableGestureNavigation(boolean)).\nFor more information, see\n[Handle keyboard actions](/training/keyboard-input/commands).\n\nUse key events directly\n-----------------------\n\n\nYou can use key events outside of a [WearableRecyclerView](/reference/androidx/wear/widget/WearableRecyclerView) to trigger new actions in response to gesture\nevents. Importantly, these gesture events are recognized when a device is in\nactive mode, and they are delivered in the same way as all key events.\n\n\nA class that relates to user interaction, such as a `View` or an\n`Activity`, and that implements\n[KeyEvent.Callback](/reference/android/view/KeyEvent.Callback) can listen to key events that relate to\nwrist gestures just as it can listed to any other key event. The Android framework\ncalls the `View` or `Activity` that has\nfocus with the key events. For gestures, the `onKeyDown()`\nmethod callback is called when gestures occur.\n\n\nAs an example, an app can override predefined actions in a `View`\nor `Activity` that implements `KeyEvent.Callback` as follows: \n\n### Kotlin\n\n```kotlin\nclass GesturesActivity : Activity() {\n\n /* KeyEvent.Callback */\n override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {\n return when (keyCode) {\n KeyEvent.KEYCODE_NAVIGATE_NEXT -\u003e\n // Do something that advances a user View to the next item in an ordered list.\n moveToNextItem()\n KeyEvent.KEYCODE_NAVIGATE_PREVIOUS -\u003e\n // Do something that advances a user View to the previous item in an ordered list.\n moveToPreviousItem()\n else -\u003e {\n // If you did not handle it, let it be handled by the next possible element as determined\n // by the Activity.\n super.onKeyDown(keyCode, event)\n }\n }\n }\n\n /** Shows the next item in the custom list. */\n private fun moveToNextItem(): Boolean {\n ...\n // Return true if handled successfully, otherwise return false.\n return false\n }\n\n /** Shows the previous item in the custom list. */\n private fun moveToPreviousItem(): Boolean {\n ...\n // Return true if handled successfully, otherwise return false.\n return false\n }\n}\n```\n\n### Java\n\n```java\npublic final class GesturesActivity extends Activity {\n\n @Override /* KeyEvent.Callback */\n public boolean onKeyDown(int keyCode, KeyEvent event) {\n switch (keyCode) {\n case KeyEvent.KEYCODE_NAVIGATE_NEXT:\n // Do something that advances a user View to the next item in an ordered list.\n return moveToNextItem();\n case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:\n // Do something that advances a user View to the previous item in an ordered list.\n return moveToPreviousItem();\n }\n // If you did not handle it, let it be handled by the next possible element as determined by the Activity.\n return super.onKeyDown(keyCode, event);\n }\n\n /** Shows the next item in the custom list. */\n private boolean moveToNextItem() {\n boolean handled = false;\n ...\n // Return true if handled successfully, otherwise return false.\n return handled;\n }\n\n /** Shows the previous item in the custom list. */\n private boolean moveToPreviousItem() {\n boolean handled = false;\n ...\n // Return true if handled successfully, otherwise return false.\n return handled;\n }\n}\n```\n\nBest practices\n--------------\n\n- Review the [KeyEvent](/reference/android/view/KeyEvent) and [KeyEvent.Callback](/reference/android/view/KeyEvent.Callback) pages for the delivery of key events to your `View` and `Activity`.\n- Keep a consistent directional affordance: use \"flick wrist out\" for next and \"flick wrist in\" for previous.\n- Have a touch parallel for a gesture.\n- Provide visual feedback.\n- Don't use a keycode to implement functionality that would be counterintuitive to the rest of the system. For example, don't use `KEYCODE_NAVIGATE_NEXT` to cancel an action or to navigate the left-right axis with flicks.\n- Don't intercept the key events on elements that are not part of the user interface, such as views that are offscreen or partially covered. This is the same as for any key event.\n- Don't reinterpret repeated flick gestures into your own novel gesture. This might conflict with the system's \"shaking the wrist\" gesture.\n- For a view to receive gesture key events, it must have [focus](/reference/android/view/View#attr_android:focusable); see [`\n View.setFocusable()`](/reference/android/view/View#setFocusable(boolean)).\n\n Because gestures are treated as key events,\n they trigger a transition out of \"touch mode\" that might do unexpected\n things. Since users may alternate between using touch and\n gestures, the [`\n View::setFocusableInTouchmode()`](/reference/android/view/View#setFocusableInTouchMode(boolean)) method could be necessary. In some\n cases, it also could be necessary to use\n `setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS)` so\n that when focus changes after a change to or from touch mode, your\n intended view gets the focus.\n- Use [requestFocus()](/reference/android/view/View#requestFocus()) and [clearFocus()](/reference/android/view/View#clearFocus()) carefully:\n - When calling `requestFocus()`, make sure it's appropriate for the view to have focus. If the view is offscreen or is covered by another view, surprises can occur when gestures trigger callbacks.\n - The `clearFocus()` method initiates a focus search to find another suitable view. Depending on the view hierarchy, this search might require nontrivial computation. It can also end up assigning focus to a view you don't expect to receive focus.\n- Key events are delivered first to the view with focus in the view\n hierarchy. If the focused view does not handle the event---in other words, it returns\n `false`---the event is not delivered to the parent view, even\n if it can receive focus and has a [`\n KeyListener`](/reference/android/text/method/KeyListener). Rather, the event is delivered to the current activity\n holding the view hierarchy with focus.\n\n Therefore, it might be necessary to\n catch all events at the higher level, then pass relevant codes down.\n Alternatively, you might subclass the activity and override the\n [dispatchKeyEvent(KeyEvent event)](/reference/android/app/Activity#dispatchKeyEvent(android.view.KeyEvent)) method to intercept keys\n when necessary or handle them when they are not handled at\n lower layers."]]