回答:
@Override
public boolean onTouchEvent(MotionEvent event)
{
int x = (int)event.getX();
int y = (int)event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
}
return false;
}
3つのケースは、さまざまな種類のイベントに対応できるようにするためのものです。この例では、指をもう一度タップ、ドラッグ、または持ち上げます。
与えられた OnTouchListener
private View.OnTouchListener handleTouch = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("TAG", "touched down");
break;
case MotionEvent.ACTION_MOVE:
Log.i("TAG", "moving: (" + x + ", " + y + ")");
break;
case MotionEvent.ACTION_UP:
Log.i("TAG", "touched up");
break;
}
return true;
}
};
いくつかのビューに設定:
myView.setOnTouchListener(handleTouch);
これにより、タッチリスナーが割り当てられているビューを基準にしたタッチイベント座標が得られます。ビューの左上隅は(0, 0)です。ビューの上で指を動かすyと、マイナスになります。ビューの左に指を移動するxと、負になります。
int x = (int)event.getX();
int y = (int)event.getY();
デバイス画面の左上隅を基準とした座標が必要な場合は、生の値を使用します。
int x = (int)event.getRawX();
int y = (int)event.getRawY();
return falseそれ以外の場合はタッチを消費することを忘れないでください。
getRawX()およびgetRawY()リスナーが追加されている任意のビュー上のタッチ位置の絶対座標を返すべきです。ただし、その上にを返す別のビューがある場合true、下位のビューにはタッチイベントが通知されません。
getX()し、getY()うまく仕事(の必要がありませんgetRawX/Y())。
onInterceptTouchEventてから戻るfalseと、イベントは通常どおりに処理されます。
これがコルティンスタイルです。これをプロジェクトで使用すると、非常にうまく機能します。
this.yourview.setOnTouchListener(View.OnTouchListener { _, event ->
val x = event.x
val y = event.y
when(event.action) {
MotionEvent.ACTION_DOWN -> {
Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y")
}
MotionEvent.ACTION_MOVE -> {
Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y")
}
MotionEvent.ACTION_UP -> {
Log.d(TAG, "ACTION_UP \nx: $x\ny: $y")
}
}
return@OnTouchListener true
})