대화식 시계 모드 생성

사용자가 다양한 방식으로 시계 모드와 상호작용할 수 있습니다. 예를 들어, 사용자가 시계 모드를 탭하여 현재 재생 중인 노래가 무엇인지 알아보거나 오늘의 일정을 확인할 수 있습니다. Wear OS by Google에서는 시계 모드의 주어진 위치에서 이 시계 모드가 단일 탭 동작을 수락할 수 있습니다. 단, 이 동작에 함께 반응하는 또 다른 UI 요소가 없어야 합니다.

이 과정에서는 대화식 시계 모드를 구현하는 방법을 다루며 이를 위해 먼저 시계 모드 스타일을 구성한 다음, 동작 처리를 구현합니다.

참고: 대화식 시계 모드에서 개발 작업을 시작하기 전에 반드시 대화식 시계 모드에 대해 읽어보세요.

탭 이벤트 처리

대화식 시계 모드 스타일을 구성할 때 앱이 먼저 해야 할 일은 시계 모드가 탭 이벤트를 수신한다고 시스템에 알리는 것입니다. 다음 예시에서 그 방법을 보여줍니다.

Kotlin

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

Java

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

시스템이 시계 모드에서 탭을 감지하면 WatchFaceService.Engine.onTapCommand() 메서드를 트리거합니다. 수행하기 원하는 액션(예: 상세 걸음 수 표시 또는 시계 모드의 테마 변경)을 시작하려면 WatchFaceService.Engine 구현에서 이 메서드를 재정의합니다. 동작 처리의 코드 스니펫은 이러한 구현의 예시를 보여줍니다.

동작 처리

일관된 사용자 환경을 제공하기 위해 시스템은 드래그, 길게 누름 등의 동작을 시스템 UI 요소에 예약합니다. 따라서 시스템이 원시 터치 이벤트를 시계 모드로 보내지 않습니다. 그 대신, 시스템이 특정 명령을 onTapCommand() 메서드로 보냅니다.

사용자가 처음에 화면을 터치하면 시스템은 첫 번째 명령인 TAP_TYPE_TOUCH를 보냅니다. 이 이벤트는 터치 시에 사용자에게 시각적 피드백을 제공합니다. 이 이벤트가 트리거되는 경우에는 앱이 UI를 시작해서는 안 됩니다. UI를 시작하면 드래그 이벤트가 앱 런처, 설정 창 및 알림 스트림을 열지 못합니다.

다음 번 명령을 보내기 전에 시스템은 이 접촉이 단일 탭인지 여부를 판단합니다. 허용되는 유일한 동작은 단일 탭입니다. 사용자가 손가락을 바로 들어올리면 시스템은 단일 탭이 발생했다고 결정하고 TAP_TYPE_TAP 이벤트를 전달합니다. 사용자가 손가락을 바로 들어올리지 않으면 시스템은 TAP_TYPE_TOUCH_CANCEL 이벤트를 전달합니다. 사용자가 TAP_TYPE_TOUCH_CANCEL 이벤트를 트리거한 경우에는 화면에 새로운 접촉이 있을 때까지 TAP_TYPE_TAP 이벤트를 트리거할 수 없습니다.

다음 예시는 시계 모드에서 탭 이벤트를 구현하는 방법을 보여줍니다.

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

이 예시에서 앱은 어떤 종류의 이벤트가 발생했는지 판별하고 그에 따라 응답합니다. 사용자의 손가락이 처음 접촉한 이벤트라면, 앱이 시각적 피드백을 표시합니다. 접촉한 후 바로 손가락을 들어올리는 이벤트의 경우, 사용자가 탭한 액션이 수행됩니다. 손가락으로 계속 접촉하고 있는 이벤트라면, 앱이 아무런 작업도 수행하지 않습니다.