关于View事件分发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shb2058/article/details/73892891

关于事件分发:
dispatchTouchEvent
//是否消费,不消费就传递给上一层
对于view,super是true,走ontouchevent
对于viewgroup,如果是super,走onInterceptTouchEvent去判断是否进行拦截,如果不是,这个事件的作废;如果是true,直接消费,不再走下面的分发,如果false,给上一级的onTouchenevnt.


onInterceptTouchEvent
//是否拦截,拦截true就会在当前的onTouch走
不拦截false,就会传递到子view,子view去走dispatchEvent
对于super,这个只有viewgroup存在,默认表示不拦截


onTouchEvent
//是否消费,
true表示接收并消费,false表示向上传递,直接传递给上级的onTouch,如果都返回false,事件消失
对于super,view默认返回true,viewgroup默认返回false


onTouch 
//该事件优先于onTouchEvent,如果onTouch返回true,onTouchEvent就不会执行


重要:


对于Activity、ViewGroup、View所包含的事件


Activity:dispatchTouchEvent(dispatch有分发和处理两个不同的意思,这里理解为处理比较好)、onTouchEvent


View:和activity一样


ViewGroup:在加上一个OnInterceptTouchEvent,这个事件表示拦截,如果dispathch事件返回了super,那么就会从onInterceptTouchEvent寻找返回值,如果inter返回true,则dispatch也是true,反之相同。这个事件的调用只有在dispatch返回super的时候才会用。


对于Ontouch事件,这个事件只有view才有,而且他的优先级是大于onTouchEvent的


对于三者的优先级:activity>viewgroup>view


实例:


1.当一个事件触发,当他首先会到达activity的dispatch事件,如果返回了super,那么事件就继续传递到下一级即ViewGroup,如果返回的不是super,那么就表示这个DOWN事件被activity自己处理了,但是并不会触发onTouchEvent事件,原因待续。


2.activity的dispatch返回了super,那么事件现在到ViewGroup的dispatch了,如果viewgroup的dispatch返回来了super,那么就会去找onIntercepter的返回值了;如果不是super,返回true,事件作废,不会触发viewgroup的onTouchEvent了,原因待续,如果返回false,表示viewgroup不处理这个事件,就会给上层activity,然后触发activity的onTouchEvent。


3.到现在ViewGroup的dispatch返回了super,现在需要看onIntercept的返回值了,返回super的话,事件就去view了;如果不返回super:若true,那就是说viewgroup决定消费这个事件了,这个事件就会传递到viewgroup的onTouchEvent事件了;若false,表示viewgroup不愿意处理这个事件,相当于super,事件到view的dispatch了。


4.现在由于viewgroup不拦截(首先dispatch决定super然后onIntercept决定返回false,这两个必须同时满足才能到这里)这个事件,这个事件继续到View的dispatch了;如果view的dispatch返回了super,那表示view要处理了;如果返回的不是super:如果是true,事件作废,不会到view的onTouchEvent,和之前的viewgroup和activity一样,原因不详;如果是false,表示这个事件我不管,而且上层的viewgroup也不管,那就直接给activity的onTouchEvent了。


5.现在view的dispatch返回了super,表示我现在要处理这个事件了,那么就走到onTouch事件了,如果返回了true,事件消失,原因不详;如果返回了false,事件继续传递,传递到了onTouchEvent,如果super,那么事件就view处理了,如果true,则还是view处理;如果false就传给activity来处理。


如果拦截了down事件,那么up事件就也拦截了。


diapath决定这个事件是否需要消费,如果消费,才会有后续的分发和处理;在拿到事件之后,interce方法决定了这个时间是否被拦截,拦截就消费了,不拦截的传下去。

猜你喜欢

转载自blog.csdn.net/shb2058/article/details/73892891
今日推荐