@linux1s1s
2019-02-14T22:30:33.000000Z
字数 898
阅读 2314
AndroidView
2015-06
首先需要明确的是:不管你点击Android屏幕上的任何控件,都会调用方法
public boolean dispatchTouchEvent(MotionEvent event )
然后沿着这个事件我们先从View类的这个方法跟踪下去:
我们从上面的源代码中可以获知,这个方法中首先会有条件的执行:
onTouch(this,event)
方法,如果你设置了View的回调:
接着,如果这个回调返回了false
,表示事件没有被消耗,这个时候会继续在 dispatchTouchEvent
方法中执行onTouchEvent(event)
方法;
如果这个回调返回了一个true,表示事件已经被消耗了,这个时候在方法dispatchTouchEvent
中就不会执行 onTouchEvent(event)
方法;
接下来我们看一下onTouchEvent(MotionEvent event)
方法
L26行 performClick()方法,我们继续跟下去
所以这个时候就执行了onclick 回调方法。
这样一来我们就清醒的认识了View的事件传递:
dispatchTouchEvent(MotionEvent event) ---->>> onTouch(this, event) 如果返回false----->>> onTouchEvent(event) ----->>> performClick()
dispatchTouchEvent 负责事件的分发,这个函数返回值 false 表示分发,true 表示不再分发,这个函数的返回值 根据事件是否被消耗来决定的 ;
事件是否被消耗是通过 onTouch 和 onTouchEvent 这两个具有先后顺序的函数返回值来决定的 如果上面两个方法其中一个返回true 表示事件被消耗了;
所以 onTouch / onTouchEvent 其中有一个返回true 表示 事件消耗了,dispatchTouchEvent 方法和上面的方法返回值保持统一,也会返回 true 表示 不再 分发了,因为已经被事件消耗了;