事件分发
调用顺序:
dispatchTouchEvent()–>onInterceptTouchEvent()–>onTouchEvent()
DispathTouchEvent():
描述:是否分发事件
Default:true
不分发:false
分发事件:true
分发消息至当前控件的onTouchEvent()方法并将该事件传递至子控件(如果有的话),默认为分发,如果设置为false,则该事件不会被分发至自身的onTouchEvent(),如果ACTION_DOWN不分发,则后续动作都无法捕捉到,例如ACTION_MOVE或者ACTION_UP. 存在子控件时调用顺序为:最外层父控件-》里层父控件-》子控件
注意:DispathTouchEvent源码中,有调用onInterceptTouchEvent和onTouchEvent()
如果单纯返回true,或者false而不去执行super.dispathTouchEvent()的话,将不会调用到里面的这两个方法,从而导致事件无法传递至下一控件,返回false,只能监听到ACTION_DOWN,返回true的话只在该层的dispathTouchEvent方法中接收到事件,不会在自身和子组件中被监听到
OnInterceptTouchEvent
描述:是否拦截事件
Default:false
拦截:true
不拦截:false
拦截当前控件的屏幕事件,默认为不拦截,事件到达后开始传递至子控件的DispathTouchEvent(),如果设置为true,则该事件不会传递到子控件。存在子控件时调用顺序为:最外层父控件-》里层父控件,注意,该方法为ViewGroud里面的方法,子控件若未继承ViewGroud则无此方法,例如TextView..
OnTouchEvent
描述:是否处理、消费当前的事件
Default:false
处理:true
不处理:false
是否处理当前控件的屏幕事件,默认为不处理,如果设置为true,表示当前对该屏幕事件有消费处理。注意,如果要处理ACTION_MOVE,ACTION_CANCLE等事件,必须先对ACTION_DWON进行消费处理,即if(motion_evtion.getAction() == ACTION_DOWN){Return true;}
这样才能接收到后续的事件。