Câu trả lời:
@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;
}
Ba trường hợp là để bạn có thể phản ứng với các loại sự kiện khác nhau, trong ví dụ này là chạm hoặc kéo hoặc nhấc lại ngón tay.
Đưa ra một 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;
}
};
đặt trên một số chế độ xem:
myView.setOnTouchListener(handleTouch);
Điều này cung cấp cho bạn tọa độ sự kiện cảm ứng liên quan đến chế độ xem đã gán trình nghe cảm ứng cho nó. Góc trên cùng bên trái của chế độ xem là (0, 0). Nếu bạn di chuyển ngón tay của bạn lên trên chế độ xem, thì ysẽ là tiêu cực. Nếu bạn di chuyển ngón tay sang trái của chế độ xem, thì xsẽ là âm.
int x = (int)event.getX();
int y = (int)event.getY();
Nếu bạn muốn tọa độ liên quan đến góc trên cùng bên trái của màn hình thiết bị, thì hãy sử dụng các giá trị thô.
int x = (int)event.getRawX();
int y = (int)event.getRawY();
return falsenếu không nó sẽ tiêu thụ liên lạc.
getRawX()và getRawY()sẽ trả về tọa độ tuyệt đối của vị trí chạm trên bất kỳ chế độ xem nào mà người nghe được thêm vào. Nhưng bạn nói đúng, nếu có một chế độ xem khác trên đó trả lại true, thì sẽ không có chế độ xem thấp hơn nào được thông báo về các sự kiện chạm.
getX()và getY()hoạt động tốt (không cần getRawX/Y()).
onInterceptTouchEventvà sau đó quay lại falseđể sự kiện được xử lý như bình thường.
Đây là kiểu Koltin, tôi sử dụng kiểu này trong dự án của mình và nó hoạt động rất tốt:
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
})