Android触屏事件传递(个人实践总结)
Android触屏事件传递
一:前言
二:关于ViewGroup与其中的view视图
三:事件传递
1:一般,针对ViewGroup ,事件传递有三个方法。
- dispatchTouchEvent(); 负责事件分发,如果返回值为true,表示事件不继续分发,也不进行消费(执行onTouchEvent(),如果onTouchEvent()返回true表示消费完,false表示没有消费完),然后一级一级向上执行容器类的dispatchTouchEvent(),并且每一级的返回值为true;如果dispatchTouchEvent()返回值为false,则交给父类分发给interceptTouchEvent();
- interceptTouchEvent();负责事件拦截,如果返回false,表示不拦截,touch事件交给下一级的视图处理,如果拦截,则交给这一级的onTouchEvent()来处理;
- onTouchEvent();负责消费事件,如果返回值为true,表示消费了事件,事件消失;如果返回值为false,则向上一级执行onTouchEvent(),如果上一级继续返回false,则继续向上,如果每一级都返回false,则进入死循环,导致ANR,android 5.1也会死循环,我测试不会导致ANR(可能公司手机还没有适配好),为了避免这种情况,可以在Activity的onTouchEvent()返回true;
........... extends Activity{ public boolean dispatchTouchEvent(MotionEvent ev) { return true; } }
2:针对不是容器类的View
- dispatchTouchEvent(); 负责事件分发,如果返回值为true,表示事件不继续分发,也不进行消费(执行onTouchEvent(),如果onTouchEvent()返回true表示消费完,false表示没有消费完),这里注意了,一般这个View都存在于一个容器中,但是不执行父容器的dispatchTouchEvent(),而是执行父父容器的dispatchTouchEvent(),然后向上递归传递,为什么?个人觉得是:因为没有继承ViewGroup的(不是容器类),它没有子View,他和父容器的dispatchTouchEvent()处理时是调用的同一个,所以虽然有事件分发函数;如果dispatchTouchEvent()返回值为false,则交给父类分发给onTouchEvent()消费;个人感觉最好不要在dispatchTouchEvent()里面强行返回false,并且在里面做UI处理。
- onTouchEvent();负责消费事件,如果返回值为true,表示消费了事件,事件消失;如果返回值为false,则向上一级执行onTouchEvent(),如果上一级继续返回false,则继续向上,如果每一级都返回false,则进入死循环,导致ANR,android 5.1也会死循环,我测试不会导致ANR(可能公司手机还没有适配好),为了避免这种情况,可以在Activity的onTouchEvent()返回true;
3:关于Activity的dispatchTouchEvent()和onTouchEvent();
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。