Como obter a posição Touch no android?

92

Preciso obter a posição inicial de toque (X, Y), posição de movimento de toque e posição final de toque da tela no Android.

Alex
fonte

Respostas:

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

Os três casos são para que você possa reagir a diferentes tipos de eventos, neste exemplo, tocar ou arrastar ou levantar o dedo novamente.

dbrettschneider
fonte
7
Por que você retorna falso?
Daniel Reyhanian
1
O valor de retorno de true significaria que o evento de toque foi tratado e que evitaria que o evento se propagasse e vice-versa.
caosificador
27

Resposta complementar

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

definido em alguma vista:

myView.setOnTouchListener(handleTouch);

Isso fornece as coordenadas do evento de toque relativas à visualização que possui o ouvinte de toque atribuído a ela. O canto superior esquerdo da visualização é (0, 0). Se você mover o dedo acima da visualização, o resultado yserá negativo. Se você mover o dedo para a esquerda da visualização, o resultado xserá negativo.

int x = (int)event.getX();
int y = (int)event.getY();

Se você quiser as coordenadas relativas ao canto superior esquerdo da tela do dispositivo, use os valores brutos.

int x = (int)event.getRawX();
int y = (int)event.getRawY();

Relacionados

Suragch
fonte
Isso funciona, no entanto, em meus testes, a visualização à qual o ouvinte é adicionado não deve ser coberta por outras visualizações. Para obter coordenadas absolutas da posição tocada na tela, adicionei um framelayout como visualização de base e, em cima dele, a visualização com o ouvinte. Não se esqueça, return falsesenão consumirá o toque.
lenooh
@lenooh, getRawX()e getRawY()deve retornar as coordenadas absolutas da posição de toque em qualquer visualização à qual o ouvinte é adicionado. Mas você está certo, se houver outra visualização em cima dela que retorne true, nenhuma visualização inferior será notificada sobre eventos de toque.
Suragch
Suragch: exatamente. Como uso um FrameLayout, defino a visualização como "matchParent" getX()e getY()funciona perfeitamente (não há necessidade getRawX/Y()).
lenooh
@Suragch Existe alguma maneira de registrar o toque, mesmo que seja coberto por alguma outra tela ou tenha botões como filhos?
vignesh kumar
@vigneshkumar, as visualizações são notificadas de eventos de toque de baixo para cima (veja o link na parte inferior da minha resposta), então você pode registrar o evento onInterceptTouchEvente retornar falsepara que o evento seja processado normalmente.
Suragch
10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }
Sephy
fonte
0

Aqui está o estilo Koltin, uso no meu projeto e funciona muito bem:

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
    })
cjung
fonte