Jetpack Compose Glimmer에서 간접 포인터 입력 처리

적용 가능한 XR 기기
이 가이드는 이러한 유형의 XR 기기를 위한 환경을 빌드하는 데 도움이 됩니다.
디스플레이 안경

onIndirectPointerGesture 수정자를 사용하면 구성요소가 기기의 터치패드에서 발생하는 이벤트와 같은 상위 수준의 간접 포인터 이벤트를 수신하고 이에 응답할 수 있습니다. 이 수정자를 사용하여 터치패드 또는 유사한 소스에서 발생하는 동작을 캡처하고 처리합니다.

API 노출 영역

앱에서 처리를 제어하는 데 사용할 수 있는 콜백은 네 가지입니다.

  • onClick: 큰 수평 이동 없이 탭 또는 클릭이 성공하면 트리거됩니다.
  • onSwipeForward: 가로 스와이프가 정방향으로 거리 및 속도 기준점을 초과할 때 트리거됩니다.
  • onSwipeBackward: 가로 스와이프가 뒤로 방향으로 거리 및 속도 기준점을 초과할 때 트리거됩니다.
  • Enabled: false로 설정하면 수정자가 무시되고 콜백이 호출되지 않습니다.

스와이프 및 스크롤에 관한 시스템 동작

시스템은 터치 슬롭 기준점을 사용하여 클릭과 스와이프를 구분합니다.

  • 다운 상태에서 포인터가 크게 움직이면 onClick가 취소됩니다.
  • 이동 중에 포인터가 크게 역추적되면 스와이프 동작이 무효화됩니다.

예: 구성요소의 스와이프 및 클릭 처리 설정

다음 코드는 포커스 가능한 Box에서 스와이프 및 클릭 처리를 설정합니다.

@Composable
fun OnIndirectPointerGestureSample() {
    var lastGesture by remember { mutableStateOf("None") }

    Box(
        modifier =
            Modifier.fillMaxSize()
                .onIndirectPointerGesture(
                    enabled = true,
                    onSwipeForward = { lastGesture = "Forward" },
                    onSwipeBackward = { lastGesture = "Backward" },
                    onClick = { lastGesture = "Click" },
                )
                .focusTarget(),
        contentAlignment = Alignment.Center,
    ) {
        Text("Last Gesture: $lastGesture")
    }
}

코드에 관한 핵심 사항

  • onIndirectPointerGesture에는 포커스가 필요하므로 focusTarget도 적용되어 Box에 포커스를 지정할 수 있습니다. focusTarget 또는 surface와 같은 다른 포커스 사용 설정 수정자를 사용할 수 있습니다. 포커스가 없으면 수정자는 간접 포인터 이벤트에 반응할 수 없습니다.
  • 이 예에서는 onSwipeForward 콜백과 onClick 콜백을 모두 구현하므로 감지된 스와이프 및 클릭 동작이 가로채기 및 사용되고 상위 컨테이너에 도달하지 않습니다. 하지만 특정 콜백을 null로 남겨두어 상위 컨테이너의 onIndirectPointerGesture 수정자에 동작을 전달할 수도 있습니다.