view 事件执行顺序 view.dispatchTouchEvent -> View.setOnTouchListener->View.onTouchEvent
1 当 view 可点击,onTouchListenr != null 并且 View.setOnTouchListener 返回true 三个条件都满足时,则view.dispatchTouchEvent 的事件被消费,不会再执行 View.onTouchEvent
列如
mybutton_bt.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.e(tag, "onTouch:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.e(tag, "onTouch:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.e(tag, "onTouch:ACTION_UP"); break; } return true; //返回true 则不在这行 onToucheEvent ,否则执行 } });
2: setOnLongClickListener和setOnClickListener是执行顺序
如果 view 按下时间超过500mm,则回调长按方法,执行顺序为 OnLongClickListener->OnClickListener
注 : 如果OnLongClickListener 返回true,则不执行OnClickListener,
如果view 按下时间不超过500mm,则只执行OnClickListener
如果想从源码角度理解,推荐参考:http://blog.csdn.net/lmj623565791/article/details/38960443