Saya perlu mendapatkan posisi awal sentuh (X, Y), posisi gerakan sentuh, dan posisi ujung sentuh layar di android.
Jawaban:
@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.
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();
return falsejika tidak maka akan memakan sentuhan.
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.
getX()dan getY()berfungsi dengan baik (tidak perlu getRawX/Y()).
onInterceptTouchEventdan kemudian kembali falsesehingga acara tersebut diproses seperti biasa.
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
})