Android中触摸事件的传递
2017-6-19 liuyingcong 安卓开发
触摸事件包括按下(down)、移动(move)、抬起(up)、取消(cancel),还会判断分发点击(click)、长按(longclick)事件,后两种不属于触摸事件。
根据点击事件所在的载体来看:
- activity:触摸事件最先传递到activity,再传递给界面根布局,然后依次向下传递
- dispatchTouchEvent()是触摸事件的入口,它将调用根布局的dispatchTouchEvent(),依次调用下级,如返回true代表下级处理了该事件,如返回false,则会调用onTouchEvent()方法,最终返回true代表事件处理成功,false代表失败。
- 叶子View:在dispatchTouchEvent()方法中会优先调用OnTouchListener.onTouch(),如果监听器为空或该方法返回false,则会调用onTouchEvent()方法,如果该方法也返回false,则dispatchTouchEvent()返回false,表示事件处理失败。
- onTouchEvent()方法中会判断分发点击、长击事件。
- ViewGroup:在dispatchTouchEvent()方法中会优先调用onInterceptTouchEvent()方法,返回true则不分发给下级,通过OnTouchListener.onTouch()、onTouchEvent()处理,如果都没做处理,返回false。返回false则将事件分发给下级。
触摸事件自上而下传递,直到传递给叶子view(传递过程中没有被截断),这个过程是通过层层调用dispatchTouchEvent()方法实现的。传递到最底层以后,从下往上尝试处理该事件,并将结果传递给上级,这个过程是通过子dispatchTouchEvent()的返回结果判断的。
控件可以通过dispatchTouchEvent()方法拦截事件,使其不往下传递;也可以dispatchTouchEventSupper(ev)刻意传递。也可以通过requestDisallowInterceptTouchEvent()方法不让父控件拦截事件的传递。