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()方法不让父控件拦截事件的传递。

网站备案号:京ICP备11043289号-1 北京市公安局网络备案 海1101084571
版权所有 北京育灵童科技发展有限公司 Copyright © 2002-2024 www.elight.cn, All Rights Reserved