在android界面开发中,经常可以遇到一些多层控件嵌套的情况,如果父子控件都有对应的手势操作(如scrollview中嵌套pageview),那么他们都手势操作就有可能相互干扰,影响界面的流畅性和体验。
首先,要谈一下android父子控件之间事件的分发,对于事件的分发有几个原则需要了解。
(1) android事件分发是从父控件向子控件逐级分发传递的。(2) 每一层控件都可能消费这个事件,消费后不再向下传递(这也是父子控件对于手势操作冲突的主要原因)。
(3) android系统中的每个ViewGroup的子类都具有下面三个和事件分发处理密切相关的方法:
1.public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
2.public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3.public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
(4) android的触摸是由一个ACTION_DOWN(按下),多个ACTION_MOVE(移动),一个ACTION_UP(抬起)组成。
父子控件间的事件传递,用一张图可以更好的体现:
1
(1)、distachTouchEvent用于分发事件,true直接消费事件并不在分发,false向intercertTouchEvent分发