Android onTouchListener прекращает получать события, когда палец двигается вверх - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть пользовательское представление со следующим 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.

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

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

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

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

1 голос
/ 21 сентября 2015

Ну, это может быть старым, но это все еще появляется в результатах поиска. Можно запретить 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;
    }
};
0 голосов
/ 05 сентября 2011

вы должны указать событие в 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;
    }
};
...