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

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

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

API サーフェス

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

  • onClick: 水平方向の大きな移動を伴わないタップまたはクリックが成功した場合にトリガーされます。
  • onSwipeForward: 水平方向のスワイプが前方方向の距離と速度のしきい値を超えたときにトリガーされます。
  • onSwipeBackward: 水平方向のスワイプが後方方向の距離と速度のしきい値を超えたときにトリガーされます。
  • Enabled: false に設定すると、修飾子は無視され、コールバックは呼び出されません。

スワイプとスクロールのシステム動作

システムは、タッチ スロップのしきい値を使用して、クリックとスワイプを区別します。

  • ダウン状態の間にポインタが大幅に移動すると、onClick がキャンセルされます。
  • 移動中にポインタが大幅に後退すると、スワイプ ジェスチャーは無効になります。

例: コンポーネントのスワイプとクリックの処理を設定する

次のコードは、フォーカス可能な Box のスワイプとクリックの処理を設定します。

@Composable
@Sampled
fun OnIndirectPointerGestureSample() {
    Box(
        modifier =
            Modifier.fillMaxSize()
                .onIndirectPointerGesture(
                    enabled = true,
                    onSwipeForward = { /* onSwipeForward */ },
                    onSwipeBackward = { /* onSwipeBackward */ },
                    onClick = { /* onClick */ },
                )
                .focusTarget()
    ) {
        // App()
    }
}

コードに関する主なポイント

  • onIndirectPointerGesture にはフォーカスが必要なため、focusTarget も適用して Box をフォーカス可能にします。focusTarget または surface などの別のフォーカス有効化修飾子を使用できます。フォーカスがない場合、修飾子は間接的なポインタ イベントに対して動作できません。
  • この例では onSwipeForward コールバックと onClick コールバックの両方を実装しているため、検出されたスワイプ ジェスチャーとクリック ジェスチャーはインターセプトされて消費され、親コンテナに伝播されません。ただし、特定のコールバックを null にして、ジェスチャーを親コンテナの onIndirectPointerGesture 修飾子に渡すこともできます。-