Làm thế nào để có được vị trí Touch trong Android?


92

Tôi cần có được vị trí bắt đầu chạm (X, Y), vị trí di chuyển chạm và vị trí kết thúc chạm của màn hình trong Android.

Câu trả lời:


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

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.


7
Tại sao bạn trả về false?
Daniel Reyhanian

1
Giá trị trả về của true có nghĩa là sự kiện chạm đã được xử lý và điều đó sẽ ngăn sự kiện lan truyền và ngược lại.
hỗn loạn

27

Câu trả lời bổ sung

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

Có liên quan


Điều này hoạt động, tuy nhiên trong thử nghiệm của tôi, chế độ xem mà người nghe được thêm vào, không nên bị che bởi các chế độ xem khác. Để có được tọa độ tuyệt đối của vị trí được chạm trên màn hình, tôi đã thêm khung hình làm chế độ xem cơ sở và trên đó là chế độ xem với người nghe. Đừng quên return falsenếu không nó sẽ tiêu thụ liên lạc.
lenooh

@lenooh getRawX()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.
Suragch

Suragch: chính xác. Vì tôi sử dụng FrameLayout nên tôi đặt chế độ xem thành "matchParent" getX()getY()hoạt động tốt (không cần getRawX/Y()).
lenooh

@Suragch Có cách nào để ghi lại cảm ứng ngay cả khi nó bị che bởi một số chế độ xem khác hoặc có các nút trẻ em thích không?
vignesh kumar

@vigneshkumar, các lượt xem được thông báo về các sự kiện chạm từ dưới lên (xem liên kết ở cuối câu trả lời của tôi), vì vậy bạn có thể ghi lại sự kiện onInterceptTouchEventvà sau đó quay lại falseđể sự kiện được xử lý như bình thường.
Suragch

10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }

0

Đâ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
    })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.