dispatchTouchEvent()
作用对象:Activity ViewGroup View
true: 代表处理此事件 时间不会再向下分发 到此结束
super(): 将事件分发到自己的onInterceptTouchEvent()方法【Acitvity没有onInterceptTouchEvent,直接传给子类的dispatchTouchEvent方法,View没有onInterceptTouchEvent,直接传给自己的onTouchEvent方法】
false: 代表没有能力处理事件或者是不处理事件,将事件传递给父view的onTouchEvent()方法【Activity没有父类,所以直接停掉这个事件】
特殊说明:如果Down事触发这个方法,不论返回值是什么,move和up都会再次经过此方法
onInterceptTouchEvent()
作用对象:ViewGroup
true:代表拦截此事件 交给自己的onTouchEvent()处理
super():代表不拦截此事件,将事件下发给子View的dispatchTouchEvent方法
false:代表不拦截此事件,将事件下发给子View的dispatchTouchEvent方法
特殊说明:1.一次事件中,该方法一旦被调用并返回true就不会再被调用了,比如在douwn事件是返回了true,那么之后的move和up都不会经过此方法,而是直接执行onTouchEvent()方法了
2.假设ViewGroup在down事件中返回了false,而是在move中返回了true,那么down事件会传递给子View,但是这个move虽然说返回了true,但是他并不会传给自己的onTouchEvent()方法,而是被作为一个cancel事件传递给子view,后续事件才会传递给自身的view处理,而子类view不会再接收到后续事件
onTouchEvent()
作用对象:Activity ViewGroup View
true:代表处理此事件 move 和up事件才会被处理
super(): 代表不处理此事件,将事件传递给父View的onTouchEvent()事件
false:代表不处理此事件,将事件传递给父View的onTouchEvent()事件
···········
常见问题:
问:在ViewGroup中当dispatchTouchEvent拦截了Down事件之后,后续的MOVE与UP事件如何执行?
答:后续的Move和Up都会在经过此方法
问:在onTouchEvent中返回true或者false对于后续MOVE、UP方法的影响?
答:在点击事件中,事件的优先级为 onTouch > onTouchEvent > onClick,当优先级高的事件返回true之后,优先级低的事件就不会再执行了,如果想要执行,必须优先级高的事件返回false才可以执行。
问:在onInterceptTouchEvent中返回true时,MOVE与UP事件如何执行?
答:后续的Move和Up都不会经过此方法,而是直接到onTouchEvent()方法中处理事件
问:onTouch和onTouchEvent有什么区别,又该如何使用?
答:这两个方法都是在dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行,如果在onTouch中通过返回true将时间消费了,那么onTouchEvent将不会在执行。另外,onTouch能够执行需要两个条件,一个是改view不许是enable的另一个是mOnTouchListener是不为空的。所以如果你有一个控件是非enable的,那么他注册的onTouch事件将永远不会执行,只能重写他的onTouchEvent方法来实现。
问:为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?
答:以为他的onTouch方法返回了true,之后的onTouchEvent()方法不会得到执行,
问:为什么图片轮播器里的图片使用Button而不用ImageView?
答:因为imageView默认是不可点击的。两种方法处理,1:将touch方法返回值改为true,2:设置imageView的clickable为true
网友评论