在了解android view事件体系前,先了解下android UI界面架构图。
从上图可以简单总结出view触摸事件的传递顺序(假设点击到ViewGroup):
Activity--->PhoneWindow-->DecorView--->ContentView--->ViewGroup
View事件体系结论总结
当所有事件方法按默认返回时,ACTION_DOWN其呈现U形分布,其余的ACTION_MOVE和ACTION_UP事件只会经过Activity.onTouchEvent,不会经过其他控件。
当Activity.dispatchTouchEvent()返回true或false时,都表示事件被消费,不会向下传递了(只有默认返回super.dispatchTouchEvent()时,才会继续往下传递事件)。
ViewGroup.onInterceptTouchEvent()只有事件拦截作用,没有消费事件作用,即若有事件经过onInterceptTouchEvent()时,那么该事件肯定会继续进行传递,只是传递的方向受其返回值控制。
当dispatchTouchEvent()和onTouchEvent()返回true时,表明消费了事件,则事件不再进行传递。其后的同一事件序列的ACTION_MOVE和ACTION_UP都会从上往下只传递到该控件上该方法(该控件下的子控件是无法再收到任何事件的),如果该控件对MOVE和UP事件返回false,则其父控件的onTouchEvent并不会被调用,最终这些消失的事件都交给Activity.onTouchEvent处理。
当dispatchEvent()和onTouchEvent()返回false时,都会立即回掉父控件的onTouchEvent()。
onTouchListener.onTouch()会优先于onTouchEvent被调用,且只有当onTouchListener.onTouch()返回false时,onTouchEvetn才会被调用,然后才能调用onClickListener.onClick()。