[Android]事件分发的一些知识

2018-09-11  本文已影响0人  黑森林中的小木屋

1、同一个事件序列是指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以down事件开始,中间含有数量不定的move事件,最终以up事件结束

2、正常情况下,一个事件序列只能被一个view拦截并消耗。这一条的原因可以参考3,因为一旦一个元素拦截了某事件,那么同一个事件序列内的所有事件都会直接交给它处理,因此同一个事件序列中的事件不能分别由两个view同时处理,但是通过特殊手段可以做到,比如一个view将本该自己处理的事件通过onTouchEvent强行传递给其他View处理。
那有时候我们需要当发生某事件序列时,我需要父容器先处理,然后在传递给子View怎么办?重写dispatchTouchEvent(MotionEvent ev)方法,在里面处理我们的逻辑

3、某个view一旦决定拦截,那么这一个事件序列都只能由它来处理(如果事件序列能够传递给他的话),并且它的onInterceptTouchEvent不会再被调用。就是说当一个view决定拦截一个事件后,那么系统会把同一序列中的其他事件都直接交由它处理,就没必要在调用onInterceptTouchEvent方法了

4、某个view一旦开始处理某事件(调用了onTouchEvent方法),如果它不消耗ACTION_DOWN事件,那么同一事件序列中的其他事件都不会再交给它处理,并且事件重新交由父容器View处理,即父容器view的onTouchEvent方法会被调用

5、如果view不消耗除ACTION_DOWN意外的其他事件,那么这个点击事件会消失,此时父容器VIew的onTouchEvent并不会被调用,并且当前view可以接收到后续事件,最终,这些消失的点击事件会传递给Activity处理

6、ViewGroup默认不拦截任何事件,onInterceptTouchEvent默认返回false

7、View没有onInterceptTouchEvent方法,一旦事件传递给他( dispatchTouchEvent(MotionEvent ev)被调用),它的onTouchEvent被调用

8、View的onTouchEvent默认都会消耗事件,除非是不可点击的(clickable和longClickable同时为false),view的longClickable默认都为false,clickable分情况,比如Button的为true,TextView的为false

9、view的enable属性不营销onTouhEvent的返回值

10、onClick会发生的前提是当前view是可点击的,并且接收到了down和up事件

11、事件分发过程是由外向内,事件总会先传递到父元素,然后在传递到子元素。子元素通过requestDisallowInterceptTouchEvent可以干预父元素的事件分发过程,但是down事件除外

上一篇下一篇

猜你喜欢

热点阅读