Android onTouchListener перестает получать события, когда палец перемещается вверх

У меня есть настраиваемое представление со следующим OnTouchListener, назначенным ему в моей деятельности:

private OnTouchListener MyOnTouchListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        System.out.println("onTouch called.");
        System.out.println("x" + event.getX() + ", y: " + event.getY());
        return true;
    }
};

Это регистрирует и отображает события в журнале, как и ожидалось, до тех пор, пока пользователь не переместит палец вверх или вниз более чем на несколько пикселей. После этого никакие события касания не передаются прослушивателю, пока пользователь не удалит и не приложит палец снова. Однако использование adb shell getevent показывает, что события все еще генерируются. Пример вывода LogCat с аннотациями можно найти по адресу http://pastebin.com/7EBM2X4V.

Дело не в том, что палец выходит за пределы поля зрения.

Кто-нибудь знает, почему у меня такое поведение?


person Tim Timmingson    schedule 05.09.2011    source источник


Ответы (3)


Оказывается, проблема в том, что представление содержится в ScrollView. Удаление ScrollView устраняет проблему.

person Tim Timmingson    schedule 06.09.2011

Ну, это может быть старым, но он все еще появляется в результатах поиска. Можно предотвратить перехват событий касания ScrollView, выполнив следующие действия:

private OnTouchListener MyOnTouchListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
//our touch handling began, request the scrollview not to interact
scrollView.requestDisallowInterceptTouchEvent(true);
           System.out.println("Down");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }else if(event.getAction()==MotionEvent.ACTION_MOVE){
           System.out.println("Move");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }else if(event.getAction()==MotionEvent.ACTION_UP){
//re-enable it after we're done (finger goes up)
scrollView.requestDisallowInterceptTouchEvent(true);
           System.out.println("up");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }

        return true;
    }
};
person Leo Starić    schedule 20.09.2015

вы должны указать событие в onTouch, например вниз, движение или вверх, для этого вы должны сделать так.

private OnTouchListener MyOnTouchListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
           System.out.println("Down");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }else if(event.getAction()==MotionEvent.ACTION_MOVE){
           System.out.println("Move");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }else if(event.getAction()==MotionEvent.ACTION_UP){
           System.out.println("up");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }

        return true;
    }
};
person Pratik    schedule 05.09.2011
comment
Нет, не знаешь. Даже если я изменю его на это, он все равно не будет работать должным образом. - person Tim Timmingson; 05.09.2011