假设Android事件传送路径为A-B-C-D-E;
一个手势是由事件action_down开始和action_move等其它事件以及事件action_up结束的集合;
一个action_down意味着一个新的手势的开始,aciton_up意味着一个手势的结束;
事件由activity的dispatchevent开始,通过调用子view(包括viewgroup)的dispatchevent向下传递,直到为一个view为止;
之后事件会由最下层的view向上传递,由onTouchEvent进行处理,一直传递到activity的onTouchEvent;
首先框架层最先处理的是action_down事件,如果此事件在传递过程中没有被oninterceptEvent掉(返回true为阻止),那么此事件将一直传递到最下层;
此时事件将开始由下开始往上传递,并且如果在途中某一层(假设为D)消费掉(即onTouchEvent返回true),那么此事件将终止向上传递,并且以后事件也会通过D的dispatchEvent方法直接调用onTouchEvent方法进行处理(事件传递顺序A-B-C-D);
如果传递过程中没有任何onTouchEvent进行消费,那么以后此事件将直接由activity的onTouchEvent进行处理。这意味着如果你想在某一层处理手势,你务必要在该层消费action_down以确保以后可以接收到事件。
action_down事件处理结束后将开始其它事件的处理(以下事件都是除了action_down的事件);
你可以在某一层的onInterceptEvent中随时决定是否终止向下传递事件,这取决于你的手势处理逻辑;onInterceptEvent之后你将永远不能在向下传递事件了。 requestDisallowInterceptTouchEvent将阻止viewgroup对事件进行中断;
如果在某一层onTouchEvent处理某一事件,并进行消费掉,那么该事件将不会在向上传递;否则将继续向上传递。