OnTouchListener представления против onTouchEvent

В чем разница между представлением onTouchEvent :

public class MyCustomView extends View {
    // THIS :
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }
}

и его onTouchListener :

MyCustomView myView = (MyCustomView) findViewById(R.id.customview);
myView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public void onClick(View arg0) {
        // do something
    }
});

или

public class MyCustomView extends View {

    public MyCustomView(Context context, AttributeSet attrs) {
        // THIS :
        setOnTouchListener(new View.OnTouchListener() {
            @Override
            public void onClick(View arg0) {
                // do something
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }
}

Если эти два различны,
Нужно ли нам реализовывать оба?
Какой из них вызывается первым?

Если у меня есть некоторые функции прокрутки и масштабирования, должен ли я реализовать их внутри onTouchEvent или onTouchListener?


person topher    schedule 27.10.2013    source источник
comment
Код для OnTouchListener должен иметь метод onTouch, а не onClick.   -  person Ricardo Rivaldo    schedule 05.08.2014


Ответы (2)


Ответ LeeYiHong правильный, и еще одна очень важная вещь - это то, что написано на http://developer.android.com/reference/android/view/View.OnTouchListener.html:

Обратный вызов [i.e. View.OnTouchListener -> onTouch(View v, MotionEvent event)] будет вызван до того, как событие касания [i.e. onTouchEvent(MotionEvent)] будет передано представлению.

person Elia12345    schedule 23.01.2015
comment
Помимо того, где они работают и в каком порядке они обрабатываются, есть ли между ними какая-либо функциональная разница? Другими словами, есть ли что-то, что вы можете сделать с одним, но не можете сделать с другим? или проще? Почему кто-то выбирает один вместо другого, или это полная жеребьевка? - person gotube; 06.04.2015

Я не уверен, что вы нашли свой ответ. Но я нашел связанные вопросы, похожие на ваши.

«onTouch работает везде, где вы хотите (будь то в активности или в представлении), если вы объявили интерфейс и правильно настроили прослушиватель! С другой стороны, onTouchEvent работает только внутри представления!»

Для функций прокрутки и масштабирования, я думаю, onTouchListener будет достаточно для выполнения обеих функций (и многих других, таких как вращение и т. д.).

person Lee Yi Hong    schedule 01.11.2013
comment
Что вы имеете в виду под произведениями? Что значит сказать, что onTouchEvent не работает внутри действия? Вы имеете в виду, что можете реализовать onTouchEvent только в объекте View? - person gotube; 06.04.2015