Як отримати позицію дотику в android?


92

Мені потрібно отримати початкове положення дотику (X, Y), положення переміщення та торкання кінця екрана в android.

Відповіді:


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;
}

У трьох випадках ви можете реагувати на різні типи подій, у цьому прикладі постукування, перетягування або підняття пальця знову.


7
Чому ви повертаєте неправду?
Даніель Рейханян,

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();

Пов’язані


Це працює, однак під час мого тестування погляд, до якого додається слухач, не повинен охоплюватися іншими поглядами. Щоб отримати абсолютні координати доторкнутої позиції на екрані, я додав макет кадру як базовий вигляд, а поверх нього - перегляд зі слухачем. Не забувайте, return falseінакше він поглине дотик.
lenooh

@lenooh, getRawX()і getRawY()повинен повертати абсолютні координати положення дотику на будь-якому поданні, до якого додається слухач. Але ви маєте рацію, якщо поверх нього є інший вигляд, який повертається true, тоді про нижчі види не повідомлятимуться про події дотику.
Сурагч

Сурач: точно. Так як я використовую FrameLayout, я встановити вид на «matchParent» так getX()і getY()працюють нормально (немає необхідності getRawX/Y()).
lenooh

@Suragch Чи є спосіб записати дотик, навіть якщо він охоплюється якимсь іншим видом або у дітей є такі кнопки?
vignesh kumar

@vigneshkumar, подання повідомляються про події дотику знизу вгору (див. посилання внизу моєї відповіді), щоб ви могли записати подію в, onInterceptTouchEventа потім повернутись, falseщоб подія оброблялася як зазвичай.
Сурач

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
    })
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.