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