Bagaimana cara mendapatkan posisi Touch di android?

92

Saya perlu mendapatkan posisi awal sentuh (X, Y), posisi gerakan sentuh, dan posisi ujung sentuh layar di android.

Alex
sumber

Jawaban:

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

Ketiga kasus tersebut dibuat agar Anda dapat bereaksi terhadap jenis kejadian yang berbeda, dalam contoh ini mengetuk atau menyeret atau mengangkat jari lagi.

dbrettschneider
sumber
7
Mengapa Anda mengembalikan salah?
Daniel Reyhanian
1
Nilai kembalian dari true berarti bahwa peristiwa sentuh ditangani dan itu akan mencegah acara menyebar dan sebaliknya.
chaosifier
27

Jawaban tambahan

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

diatur pada beberapa tampilan:

myView.setOnTouchListener(handleTouch);

Ini memberi Anda koordinat peristiwa sentuh yang terkait dengan tampilan yang telah ditetapkan oleh pendengar sentuh. Sudut kiri atas tampilan adalah (0, 0). Jika Anda menggerakkan jari Anda di atas tampilan, hasilnya yakan negatif. Jika Anda menggerakkan jari Anda ke kiri tampilan, hasilnya xakan negatif.

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

Jika Anda ingin koordinat relatif ke pojok kiri atas layar perangkat, gunakan nilai mentah.

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

Terkait

Suragch
sumber
Ini berfungsi, namun dalam pengujian saya, tampilan yang ditambahkan pendengar, tidak boleh dicakup oleh tampilan lain. Untuk mendapatkan koordinat absolut dari posisi yang disentuh di layar, saya menambahkan framelayout sebagai tampilan dasar, dan di atasnya, tampilan dengan pendengar. Jangan lupa return falsejika tidak maka akan memakan sentuhan.
lenooh
@lenooh, getRawX()dan getRawY()harus mengembalikan koordinat absolut dari posisi sentuh pada tampilan apa pun tempat pendengar ditambahkan. Tapi Anda benar, jika ada tampilan lain di atasnya yang kembali true, maka tidak ada tampilan bawah yang akan diberi tahu tentang peristiwa sentuh.
Suragch
Suragch: tepatnya. Karena saya menggunakan FrameLayout, saya menyetel tampilan ke "matchParent" jadi getX()dan getY()berfungsi dengan baik (tidak perlu getRawX/Y()).
lenooh
@Suragch Apakah ada cara untuk merekam sentuhan bahkan jika itu tertutup oleh pandangan lain atau memiliki tombol seperti anak-anak?
vignesh kumar
@vigneshkumar, tampilan akan diberi tahu tentang peristiwa sentuh dari bawah ke atas (lihat tautan di bagian bawah jawaban saya), sehingga Anda dapat merekam acara onInterceptTouchEventdan kemudian kembali falsesehingga acara tersebut diproses seperti biasa.
Suragch
10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }
Sephy
sumber
0

Ini adalah gaya Koltin, saya menggunakan ini dalam proyek saya dan bekerja dengan sangat baik:

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
sumber