Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

대화형 시계 모드 만들기

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

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

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

탭 이벤트 처리

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

Kotlin

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

자바

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

자바

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

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