タップ、ドラッグ、その他のジェスチャ
この文書では、次のことを聞いて対応する方法について説明します。ジェスチャー flutterで。 ジェスチャの例には、タップ、ドラッグ、スケーリングなどがあります。
Flutter のジェスチャ システムには 2 つの別々のレイヤーがあります。 最初の層には、次のような生のポインター イベントが含まれています。 ポインターの位置と動き (例: タッチ、マウス、スタイラスなど)を画面全体に表示します。 2番目の層には、ジェスチャー意味論を記述するもの 1 つ以上のポインターの動きで構成されるアクション。
ポインタ
ポインタはユーザーのインタラクションに関する生データを表します デバイスの画面で。 ポインタ イベントには 4 つのタイプがあります。
PointerDownEvent
- ポインタが画面の特定の位置に接触しました。
PointerMoveEvent
- ポインタが画面上のある場所から別の場所に移動しました。
PointerUpEvent
- ポインタが画面に触れなくなりました。
PointerCancelEvent
- このポインターからの入力は、このアプリに向けられなくなります。
ポインタが下にあると、フレームワークは次の処理を実行します。ヒットテストあなたのアプリ上で の場所にどのウィジェットが存在するかを判断します。 ポインタが画面に触れました。ポインタダウンイベント (およびそのポインターの後続のイベント) がディスパッチされます ヒットテストで見つかった最も内側のウィジェットに。 そこから、イベントがツリーをバブルアップしてディスパッチされます。 最も内側からパス上のすべてのウィジェットに ウィジェットをツリーのルートに追加します。のためのメカニズムはありません ポインター イベントがさらにディスパッチされるのをキャンセルまたは停止します。
ウィジェット レイヤーからポインター イベントを直接リッスンするには、Listener
ウィジェット。ただし、一般的には、
代わりに、ジェスチャー (後述) を使用することを検討してください。
ジェスチャー
ジェスチャは意味論的なアクション (タップ、ドラッグ、 およびスケール) 複数の個別のポインタから認識される イベント、場合によっては複数の個別のポインターも含まれます。 ジェスチャは、 ジェスチャのライフサイクル (例: ドラッグの開始、 ドラッグして更新し、ドラッグして終了します):
タップ
onTapDown
- タップの原因となるポインタが接触しました 特定の場所の画面。
onTapUp
- タップをトリガーするポインターが接触しなくなった 特定の場所の画面。
onTap
- 以前にトリガーしたポインター
onTapDown
も引き起こしましたonTapUp
それがタップの原因になります。 onTapCancel
- 以前にトリガーしたポインター
onTapDown
タップが発生することはありません。
ダブルタップ
onDoubleTap
- ユーザーが画面の同じ場所を 2 回タップしました。 素早い連続。
長押し
onLongPress
- ポインタは接触したままです 長時間同じ場所で画面を見続ける。
垂直方向のドラッグ
onVerticalDragStart
- ポインタが画面に触れ、動き始める可能性があります。 垂直に移動します。
onVerticalDragUpdate
- 画面に触れているポインタと、 垂直に移動すると垂直方向に移動します。
onVerticalDragEnd
- 以前に画面に触れていたポインタ そして垂直方向に動くと接触しなくなります。 画面が表示され、特定の速度で移動していたとき 画面への接触を停止しました。
水平方向のドラッグ
onHorizontalDragStart
- ポインタが画面に触れ、動き始める可能性があります。 水平方向に移動します。
onHorizontalDragUpdate
- 画面に触れているポインタと、 水平方向に移動すると、水平方向に移動します。
onHorizontalDragEnd
- 以前に接触していたポインタ 画面と水平移動が接触しなくなりました 画面とともに特定の速度で移動していた 画面に接触しなくなったとき。
パン
onPanStart
- ポインタが画面に触れて動き始める可能性があります
水平方向または垂直方向。このコールバックは次の場合にクラッシュします。
onHorizontalDragStart
またonVerticalDragStart
が設定されています。 onPanUpdate
- 画面に触れて動いているポインタ
垂直方向または水平方向。このコールバック
クラッシュする場合
onHorizontalDragUpdate
またonVerticalDragUpdate
が設定されています。 onPanEnd
- 以前に画面に触れていたポインタ
画面との接触がなくなり、移動しています
スクリーンとの接触をやめたとき、特定の速度で移動します。
このコールバックは次の場合にクラッシュします。
onHorizontalDragEnd
またonVerticalDragEnd
が設定されています。
ウィジェットにジェスチャ検出を追加する
ウィジェットレイヤーからジェスチャーを聞くには、
使うGestureDetector
。
マテリアルコンポーネントを使用している場合、
これらのウィジェットの多くはすでにタップやジェスチャーに反応しています。
例えば、IconButton
とTextButton
押す(タップ)に反応し、ListView
スワイプに反応してスクロールをトリガーします。
これらのウィジェットを使用していないが、
タップ時の「インクスプラッシュ」エフェクトを使用できます。InkWell
。
ジェスチャーの曖昧さ回避
画面上の特定の場所で、 複数のジェスチャ検出器が存在する可能性があります。 例えば:
- あ
ListTile
応答するタップ認識機能があります 全体にListTile
、そしてその周りにネストされたもの 末尾のアイコンボタン。の画面四角形 末尾のアイコンが 2 つのジェスチャで覆われるようになりました 誰が処理するかを交渉する必要がある認識者 タップされた場合のジェスチャ。 - 独身者
GestureDetector
画面領域をカバーする 複数のジェスチャを処理するように構成されており、 長押しやタップなど。 のtap
認識者はネゴシエートする必要があります とともにlong press
認識器のとき ユーザーが画面のその部分に触れます。 そのポインタで次に何が起こるかに応じて、 2 つの認識エンジンのうちの 1 つがジェスチャを受信し、 ユーザーがジェスチャを受信しない場合、またはどちらもジェスチャを受信しません タップでも長押しでもない何かを実行します。
これらのジェスチャ検出器はすべてストリームをリッスンします
通過して認識しようとするポインタ イベントの数
特定のジェスチャー。のGestureDetector
ウィジェットが決める
どのジェスチャに基づいて認識を試みるか
コールバックはnull以外です。
特定のジェスチャ認識機能が複数ある場合 画面上のポインタ、フレームワークはどちらを明確にするか 各認識エンジンを参加させることでユーザーが意図するジェスチャーを実現 のジェスチャーアリーナ。ジェスチャーアリーナがどちらを決定するか 次のルールを使用すると、ジェスチャが優先されます。
-
レコグナイザーはいつでもそれ自体を削除し、 アリーナ。アリーナにレコグナイザーが 1 つだけ残っている場合、 その認識エンジンが勝ちます。
-
認識者はいつでも自分自身が勝者であると宣言できます。 その結果、残りのすべての認識エンジンが失われます。
たとえば、水平方向と垂直方向のドラッグを明確にする場合、 両方の認識装置はポインタを受け取るとアリーナに入ります ダウンイベント。認識機能はポインタ移動イベントを監視します。 ユーザーがポインタを一定の回数以上移動すると、 水平方向の論理ピクセル。水平認識機能が宣言します。 勝利とジェスチャは水平方向のドラッグとして解釈されます。 同様に、ユーザーが論理的な数を超えて移動した場合、 垂直方向のピクセル数に応じて、垂直認識エンジンがそれ自体を宣言します勝者。
ジェスチャー アリーナは、水平方向しかない場合に有益です。 (または垂直) ドラッグ認識機能。その場合、一つだけあります アリーナ内の認識装置と水平方向のドラッグが認識される すぐに、これは水平移動の最初のピクセルを意味します ドラッグとして扱うことができるため、ユーザーは待つ必要がありません。 さらなるジェスチャーの曖昧さの解消。