タップ操作は、タッチペンに指を 1 本以上置くと アプリはこのタップパターンを操作として解釈します。そこで、 ジェスチャー検出には 2 つのフェーズがあります。
- タッチイベント データを収集しています。
- データを解釈して、 アプリがサポートするジェスチャーを選択できます
AndroidX クラス
このドキュメントの例では、
GestureDetectorCompat
および
MotionEventCompat
。これらのクラスは AndroidX
Library にあります。可能であれば AndroidX クラスを使用して、
以前のデバイスで使えます
MotionEventCompat は、
MotionEvent
クラスです。静的ユーティリティ メソッドを提供し、
関連するアクションを受け取る MotionEvent オブジェクト。
イベントです。
データの収集
ユーザーが 1 本以上の指を画面の上に置くと、
コールバック
onTouchEvent()
タッチイベントを受け取るビューに割り当てられます。タッチのシーケンスごとに
位置、圧力、サイズ、他の検出値の追加などの
指 - ジェスチャーとして識別され、onTouchEvent() は
トリガーされます。
ユーザーが画面に最初に触れたときにジェスチャーが開始され、
システムはユーザーの指の位置を追跡し、
最後の指が画面から離れる最後のイベントをキャプチャします。
このやり取り全体を通して、MotionEvent は以下を配信しました:
onTouchEvent() は、すべてのインタラクションの詳細を提供します。アプリ
MotionEvent から提供されるデータを使用して、
実行できます。
Activity または View のタップイベントをキャプチャする
Activity または
View の場合は、onTouchEvent() コールバックをオーバーライドします。
次のコード スニペットでは、
getAction()
ユーザーが行うアクションを event パラメータから抽出します。
これにより、重視するジェスチャーかどうかを判断するために必要な生データが得られます
発生します。
Kotlin
class MainActivity : Activity() { ... // This example shows an Activity. You can use the same approach if you are // subclassing a View. override fun onTouchEvent(event: MotionEvent): Boolean { return when (event.action) { MotionEvent.ACTION_DOWN -> { Log.d(DEBUG_TAG, "Action was DOWN") true } MotionEvent.ACT>ION_MOVE - { Log.d(DEBUG_TAG, "Action was MOVE") true } Mot>ionEvent.ACTION_UP - { Log.d(DEBUG_TAG, "Action was UP") true } > MotionEvent.ACTION_CANCEL - { Log.d(DEBUG_TAG, "Action was CANCEL") true } > MotionEvent.ACTION_OUTSIDE - { Log.d(DEBUG_TAG, "Movement occurred outside bounds of current screen element") > true } else - super.onTouchEvent(event) } } }
Java
public class MainActivity extends Activity { ... // This example shows an Activity. You can use the same approach if you are // subclassing a View. @Override public boolean onTouchEvent(MotionEvent event){ switch(event.getAction()) { case (MotionEvent.ACTION_DOWN) : Log.d(DEBUG_TAG,"Action was DOWN"); return true; case (MotionEvent.ACTION_MOVE) : Log.d(DEBUG_TAG,"Action was MOVE"); return true; case (MotionEvent.ACTION_UP) : Log.d(DEBUG_TAG,"Action was UP"); return true; case (MotionEvent.ACTION_CANCEL) : Log.d(DEBUG_TAG,"Action was CANCEL"); return true; case (MotionEvent.ACTION_OUTSIDE) : Log.d(DEBUG_TAG,"Movement occurred outside bounds of current screen element"); return true; default : return super.onTouchEvent(event); } }
このコードは、ユーザーがタップすると次のようなメッセージが Logcat に生成されます。 タッチと保留、ドラッグ:
GESTURES D Action was DOWN GESTURES D Action was UP GESTURES D Action was MOVE
カスタム ジェスチャーについては、これらのイベントに対して独自の処理を行って、
処理する必要があるジェスチャーかどうかを判断できます。ただし、
アプリで一般的な操作(ダブルタップ、タップ、長押し、フリングなど
Chronicle の
GestureDetector
クラスです。GestureDetector を使用すると、
個々のタッチイベントをご自身で処理せずにジェスチャーを行えます。これは、
詳しくは、ジェスチャーを検出するをご覧ください。
単一のビューのタップイベントをキャプチャする
onTouchEvent() の代わりに、
View.OnTouchListener
任意の View にマッピングできます。
オブジェクトの
setOnTouchListener()
メソッドを呼び出します。これにより、
既存の View を作成します。
Kotlin
findViewById<View>(R.id.my_view).setOnTouchListener { v, event -> // Respond to touch events. true }
Java
View myView = findViewById(R.id.my_view); myView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // Respond to touch events. return true; } });
false を返すリスナーを
ACTION_DOWN イベント。
そのようにした場合、後続のイベントに対してリスナーが
ACTION_MOVE、
ACTION_UP シーケンス
できます。これは、ACTION_DOWN がすべての開始点であるためです。
タッチイベント。
カスタムビューを作成する場合は
onTouchEvent()。前述のとおりです。
操作の検出
Android には、一般的なリソースを検出するための GestureDetector クラスが
行います。サポートされているジェスチャーは次のとおりです。
onDown(),
onLongPress(),
および
onFling()。
GestureDetector は、次と組み合わせて使用できます。
前に説明した onTouchEvent() メソッド。
サポートされている操作をすべて検出する
GestureDetectorCompat オブジェクトをインスタンス化すると、
渡すクラスは、この関数を実装するクラスです。
GestureDetector.OnGestureListener
行うことができます。GestureDetector.OnGestureListener は、
特定のタッチイベントが発生します。お客様が
GestureDetector オブジェクトを使用してイベントを受信し、ビューをオーバーライドするか、
アクティビティの onTouchEvent() メソッドを使用し、確認されたすべてのイベントを渡します。
検出インスタンスに送信されます。
次のスニペットでは、オブジェクトから true の戻り値が
個々の on<TouchEvent> メソッドが、
タッチイベントが処理されます。false の戻り値でイベントを下に渡す
ビュースタックを通過する必要があります。
次のスニペットをテストアプリで実行すると、
タッチ スクリーンを操作したときにアクションがトリガーされ、
MotionEvent の内容はタッチイベントごと。すると、
単純なインタラクションで生成されるデータの量です。
Kotlin
private const val DEBUG_TAG = "Gestures" class MainActivity : Activity(), GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { private lateinit var mDetector: GestureDetectorCompat // Called when the activity is first created. public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Instantiate the gesture detector with the // application context and an implementation of // GestureDetector.OnGestureListener. mDetector = GestureDetectorCompat(this, this) // Set the gesture detector as the double-tap // listener. mDetector.setOnDoubleTapListener(this) } override fun onTouchEvent(event: MotionEvent): Boolean { return if (mDetector.onTouchEvent(event)) { true } else { super.onTouchEvent(event) } } override fun onDown(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onDown: $event") return true } override fun onFling( event1: MotionEvent, event2: MotionEvent, velocityX: Float, velocityY: Float ): Boolean { Log.d(DEBUG_TAG, "onFling: $event1 $event2") return true } override fun onLongPress(event: MotionEvent) { Log.d(DEBUG_TAG, "onLongPress: $event") } override fun onScroll( event1: MotionEvent, event2: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { Log.d(DEBUG_TAG, "onScroll: $event1 $event2") return true } override fun onShowPress(event: MotionEvent) { Log.d(DEBUG_TAG, "onShowPress: $event") } override fun onSingleTapUp(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onSingleTapUp: $event") return true } override fun onDoubleTap(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onDoubleTap: $event") return true } override fun onDoubleTapEvent(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onDoubleTapEvent: $event") return true } override fun onSingleTapConfirmed(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onSingleTapConfirmed: $event") return true } }
Java
public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener{ private static final String DEBUG_TAG = "Gestures"; private GestureDetectorCompat mDetector; // Called when the activity is first created. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Instantiate the gesture detector with the // application context and an implementation of // GestureDetector.OnGestureListener. mDetector = new GestureDetectorCompat(this,this); // Set the gesture detector as the double-tap // listener. mDetector.setOnDoubleTapListener(this); } @Override public boolean onTouchEvent(MotionEvent event){ if (this.mDetector.onTouchEvent(event)) { return true; } return super.onTouchEvent(event); } @Override public boolean onDown(MotionEvent event) { Log.d(DEBUG_TAG,"onDown: " + event.toString()); return true; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString()); return true; } @Override public void onLongPress(MotionEvent event) { Log.d(DEBUG_TAG, "onLongPress: " + event.toString()); } @Override public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) { Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString()); return true; } @Override public void onShowPress(MotionEvent event) { Log.d(DEBUG_TAG, "onShowPress: " + event.toString()); } @Override public boolean onSingleTapUp(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString()); return true; } @Override public boolean onDoubleTap(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString()); return true; } @Override public boolean onDoubleTapEvent(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString()); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString()); return true; } }
サポートされている操作のサブセットを検出する
少数のジェスチャーのみを処理したい場合は、
GestureDetector.SimpleOnGestureListener
GestureDetector.OnGestureListener を実装する代わりに、
行うことができます。
GestureDetector.SimpleOnGestureListener は、
実装の
on<TouchEvent> メソッドを
そのすべてで false。これにより、kubectl の「get」コマンドや
考えていますたとえば、次のコード スニペットは、
GestureDetector.SimpleOnGestureListener とオーバーライド
onFling() と onDown()。
GestureDetector.OnGestureListener または
GestureDetector.SimpleOnGestureListener にすることをおすすめします。
true を返す onDown() メソッドを実装する。この
これは、すべてのジェスチャーが onDown() メッセージで始まるためです。もし
onDown() から false を返します。
GestureDetector.SimpleOnGestureListener はデフォルトで、
は、残りの操作を無視すると仮定します。
GestureDetector.OnGestureListener は呼び出されません。これにより、
想定外の問題が起きることがありますfalse のみ返品可能:
操作全体を無視する場合は onDown() を指定します。
Kotlin
private const val DEBUG_TAG = "Gestures" class MainActivity : Activity() { private lateinit var mDetector: GestureDetectorCompat public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mDetector = GestureDetectorCompat(this, MyGestureListener()) } override fun onTouchEvent(event: MotionEvent): Boolean { mDetector.onTouchEvent(event) return super.onTouchEvent(event) } private class MyGestureListener : GestureDetector.SimpleOnGestureListener() { override fun onDown(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onDown: $event") return true } override fun onFling( event1: MotionEvent, event2: MotionEvent, velocityX: Float, velocityY: Float ): Boolean { Log.d(DEBUG_TAG, "onFling: $event1 $event2") return true } } }
Java
public class MainActivity extends Activity { private GestureDetectorCompat mDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDetector = new GestureDetectorCompat(this, new MyGestureListener()); } @Override public boolean onTouchEvent(MotionEvent event){ if (this.mDetector.onTouchEvent(event)) { return true; } return super.onTouchEvent(event); } class MyGestureListener extends GestureDetector.SimpleOnGestureListener { private static final String DEBUG_TAG = "Gestures"; @Override public boolean onDown(MotionEvent event) { Log.d(DEBUG_TAG,"onDown: " + event.toString()); return true; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString()); return true; } } }