アンドロイドでタッチ位置を取得する方法は?


92

Androidで画面のタッチ開始位置(X、Y)、タッチ移動位置、タッチ終了位置を取得する必要があります。

回答:


169
@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つのケースは、さまざまな種類のイベントに対応できるようにするためのものです。この例では、指をもう一度タップ、ドラッグ、または持ち上げます。


7
なぜfalseを返すのですか?
ダニエルレイハニアン

1
trueの戻り値は、タッチイベントが処理されたことを意味します。これにより、イベントの伝播が妨げられ、その逆も同様です。
混沌化因子

27

補足回答

与えられた 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();

関連した


これは機能しますが、私のテストでは、リスナーが追加されるビューは他のビューによってカバーされるべきではありません。画面上のタッチされた位置の絶対座標を取得するために、ベースビューとしてframelayoutを追加し、その上にリスナーを持つビューを追加しました。return falseそれ以外の場合はタッチを消費することを忘れないでください。
lenooh

@lenooh、getRawX()およびgetRawY()リスナーが追加されている任意のビュー上のタッチ位置の絶対座標を返すべきです。ただし、その上にを返す別のビューがある場合true、下位のビューにはタッチイベントが通知されません。
スラッグ

Suragch:そのとおりです。私はでframeLayoutを使用しているので、私は「matchParent」にビューを設定するようにgetX()し、getY()うまく仕事(の必要がありませんgetRawX/Y())。
lenooh 2018年

@Suragch他のビューで覆われていたり、ボタンのような子供がいる場合でも、タッチを記録する方法はありますか?
vignesh kumar

@vigneshkumar、ビューは下から上にタッチイベントが通知されるため(私の回答の下部にあるリンクを参照)、イベントを記録しonInterceptTouchEventてから戻るfalseと、イベントは通常どおりに処理されます。
Suragch

10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }

0

これがコルティンスタイルです。これをプロジェクトで使用すると、非常にうまく機能します。

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
    })
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.