Jetpack Compose Glimmer で間接ポインタ入力を処理する

該当する XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
オーディオと
ディスプレイのメガネ

onIndirectPointerGesture 修飾子を使用すると、デバイスのタッチパッドから発生するような、高レベルの間接ポインタ イベントをコンポーネントが受信して応答できます。この修飾子を使用して、タッチパッドや同様のソースからのジェスチャーをキャプチャして処理します。

API サーフェス

アプリで処理を制御するために使用できるコールバックは 4 つあります。

  • 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 修飾子に渡すこともできます。