2012-06-23 35 views
7

Tôi có một nút và OnTouchListener được gắn với nó hay không. Làm thế nào tôi có thể tìm thấy nếu chuyển động (khi người dùng nhấn nút) xảy ra bên trong hoặc bên ngoài nó? Cả event.getAction() và event.getActionMasked() chỉ trả về 0, 1 hoặc 2, tương ứng là ActionDown, ActionUp, ActionMove. Có một MotionEvent.ACTION_OUTSIDE không đổi, là 4, nhưng bằng cách nào đó tôi không nhận được nó ngay cả khi tôi kéo chạm vào bên ngoài nút - Tôi vẫn nhận được 2 từ cả hai phương pháp. Có chuyện gì vậy?Android MotionEvent: tìm hiểu xem chuyển động đã xảy ra bên ngoài chế độ xem

UPD: Tôi đã tìm được giải pháp tốt - chỉ cần kiểm tra trạng thái tập trung trên chế độ xem sau ACTION_UP. Nếu nó không tập trung, nó có nghĩa là chuyển động đã xảy ra bên ngoài tầm nhìn.

Trả lời

7

Cờ đó chỉ áp dụng cho Windows chứ không áp dụng cho Chế độ xem. Bạn sẽ nhận được ACTION_MOVE khi bạn di chuyển ngón tay ra khỏi Chế độ xem, sự kiện vẫn ở trong Chế độ xem có nguồn gốc từ đó. Nhìn vào mã nguồn cho SeekBar nếu bạn cần làm rõ: ngay cả khi bạn di chuyển ngón tay ra khỏi thanh, ngón tay cái vẫn kéo!

Để thực hiện việc này ở cấp Cửa sổ, hãy sử dụng FLAG_WATCH_OUTSIDE_TOUCH, nó hoạt động tốt.

3

Nếu số OnTouchListener ở trên Button, bạn sẽ chỉ nhận được sự kiện chuyển động từ trong số Button. MotionEvent.ACTION_OUTSIDE sẽ chỉ được gọi khi sự kiện chuyển động đầu tiên nằm ngoài giới hạn của View và bạn nên coi nó như là một ACTION_UP.

5

case MotionEvent.ACTION_CANCEL làm việc cho tôi.

+0

Tại sao điều này không được đánh dấu là câu trả lời, tôi sẽ không bao giờ biết. Cảm ơn. :) –

+0

Câu trả lời này thực sự giải quyết được vấn đề của tôi. Cảm ơn nhiều. –

4

MotionEvent.ACTION_OUTSIDE không hoạt động cho Chế độ xem.

Một giải pháp là nhận vị trí chạm X và Y và xác minh xem nó có nằm trong giới hạn của Chế độ xem hay không. Nó có thể được thực hiện như thế:

@Override 
public boolean onTouchEvent(MotionEvent e) { 
    if (e.getX()<0 || e.getY()<0 || e.getX()>getMeasuredWidth() || e.getY()>getMeasuredHeight()) 
     Log.i(TAG, "TOUCH OUTSIDE"); 
    else 
     Log.i(TAG, "TOUCH INSIDE"); 

    return true; 
} 
0
public static boolean touchWithinBounds(MotionEvent event, View view) { 
    if (event == null || view == null || view.getWidth() == 0 || view.getHeight() == 0) 
     return false; 

    int[] viewLocation = new int[2]; 
    view.getLocationOnScreen(viewLocation); 
    int viewMaxX = viewLocation[0] + view.getWidth() - 1; 
    int viewMaxY = viewLocation[1] + view.getHeight() - 1; 
    return (event.getRawX() <= viewMaxX && event.getRawX() >= viewLocation[0] 
     && event.getRawY() <= viewMaxY && event.getRawY() >= viewLocation[1]); 
} 

Giải pháp cho khi bạn đang chuyển tiếp một sự kiện liên lạc từ một cái nhìn khác nhau

Các vấn đề liên quan