The Android Developer Challenge is back! Submit your idea before December 2.

Criar mostradores de relógios interativos

Um usuário pode interagir com o mostrador do relógio de muitas formas. Por exemplo, ele pode tocar no mostrador do relógio para ver que música está tocando ou para ver a agenda do dia. O Wear OS by Google permite que o mostrador do relógio aceite o gesto de um toque em um determinado local de sua interface, desde que não haja outro elemento de IU que também responda a esse gesto.

Esta lição ensina como implementar um mostrador de relógio interativo começando pela criação do estilo do mostrador e, em seguida, implementando o processamento de gestos.

Observação: antes de começar a desenvolver seu mostrador de relógio interativo, leia sobre Mostradores de relógios interativos (em inglês).

Processar gestos de toque

Ao criar um estilo de mostrador de relógio interativo, a primeira ação que o app precisa realizar é informar o sistema de que o mostrador recebe eventos de toque. O exemplo a seguir mostra como fazer isso:

Kotlin

    setWatchFaceStyle(WatchFaceStyle.Builder(service)
            .setAcceptsTapEvents(true)
            // other style customizations
            .build())
    

Java

    setWatchFaceStyle(new WatchFaceStyle.Builder(service)
            .setAcceptsTapEvents(true)
            // other style customizations
            .build());
    

Quando o sistema detecta um toque no mostrador do relógio, ele aciona o método WatchFaceService.Engine.onTapCommand(). Modifique esse método na implementação de WatchFaceService.Engine para iniciar a ação que você quer realizar, como mostrar uma contagem detalhada de passos ou alterar o tema do mostrador do relógio. O snippet de código em Processar gestos mostra um exemplo dessa implementação.

Processar gestos

Para proporcionar uma experiência de usuário consistente, o sistema reserva gestos como os de arrastar e de tocar e manter pressionado para elementos da IU do sistema. Portanto, sistema não envia eventos de toque brutos para o mostrador do relógio. Em vez disso, ele encaminha comandos específicos para o método onTapCommand().

O sistema envia o primeiro comando, TAP_TYPE_TOUCH, quando o usuário toca inicialmente na tela. Esse evento permite que você mostre um feedback visual sobre o toque para o usuário. Seu app não deve iniciar uma IU quando esse evento é acionado. Iniciar uma IU impede que eventos de arrastar abram o inicializador de apps, a aba de configurações e o fluxo de notificações.

Antes de enviar o próximo comando, o sistema analisa se o contato é um toque único, ou seja, o único gesto permitido. Se o usuário levantar o dedo imediatamente, o sistema determinará que um toque único foi realizado e encaminhará um evento TAP_TYPE_TAP. Se o usuário não levantar o dedo imediatamente, o sistema encaminhará um evento TAP_TYPE_TOUCH_CANCEL. Quando o usuário aciona um evento TAP_TYPE_TOUCH_CANCEL, não é possível acionar um evento TAP_TYPE_TAP até que ele faça um novo contato com a tela.

O exemplo abaixo mostra como implementar eventos de toque no mostrador do relógio:

Kotlin

    override fun onTapCommand(@TapType tapType: Int, x: Int, y: Int, eventTime: Long) {
        when (tapType) {
            WatchFaceService.TAP_TYPE_TAP -> {
                hideTapHighlight()
                if (withinTapRegion(x, y)) {
                    // Implement the tap action
                    // (e.g. show detailed step count)
                    onWatchFaceTap()
                }
            }

            WatchFaceService.TAP_TYPE_TOUCH ->
                if (withinTapRegion(x, y)) {
                    // Provide visual feedback of touch event
                    startTapHighlight(x, y, eventTime)
                }

            WatchFaceService.TAP_TYPE_TOUCH_CANCEL -> hideTapHighlight()

            else -> super.onTapCommand(tapType, x, y, eventTime)
        }
    }
    

Java

    @Override
    public void onTapCommand(
           @TapType int tapType, int x, int y, long eventTime) {
        switch (tapType) {
            case WatchFaceService.TAP_TYPE_TAP:
                hideTapHighlight();
                if (withinTapRegion(x, y)) {
                    // Implement the tap action
                    // (e.g. show detailed step count)
                    onWatchFaceTap();
                }
                break;

            case WatchFaceService.TAP_TYPE_TOUCH:
                if (withinTapRegion(x, y)) {
                    // Provide visual feedback of touch event
                    startTapHighlight(x, y, eventTime);
                }
                break;

            case WatchFaceService.TAP_TYPE_TOUCH_CANCEL:
                hideTapHighlight();
                break;

            default:
                super.onTapCommand(tapType, x, y, eventTime);
                break;
        }
    }
    

Nesse exemplo, o app determina o tipo de evento que ocorreu e responde da forma adequada. Se o evento for o contato inicial do dedo do usuário, o app exibirá um feedback visual. Se o evento for a elevação imediata do dedo após o contato, o app executará a ação tocada pelo usuário. Se o evento for o contato prolongado do dedo, o app não fará nada.