A View's onTouchListener vs onTouchEvent

topher picture topher · Oct 27, 2013 · Viewed 20.3k times · Source

What is the difference between a view's onTouchEvent :

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

and its onTouchListener :

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

or

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

If this two is different,
Do we need to implement both ?
Which one is invoked first ?

If I have some scrolling and zooming functionality, should I implement them inside onTouchEvent or onTouchListener ?

Answer

Elia12345 picture Elia12345 · Jan 24, 2015

Answer by LeeYiHong is correct, and the other very important thing is what is written at http://developer.android.com/reference/android/view/View.OnTouchListener.html:

The callback [i.e. View.OnTouchListener -> onTouch(View v, MotionEvent event)] will be invoked before the touch event [i.e. onTouchEvent(MotionEvent)] is given to the view.