タップ操作は、タッチペンに指を 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.ACTION_MOVE -> { Log.d(DEBUG_TAG, "Action was MOVE") true } MotionEvent.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; } } }