View事件分发机制(一)

本文详细解析了Android中点击事件的传递机制,包括同一事件序列的概念、顶级View的作用及事件分发过程中的关键方法:dispatchTouchEvent、onInterceptTouchEvent与onTouchEvent。并通过代码示例展示了这些方法间的相互作用。

关于事件传递机制这里对一些词汇进行解释:
同一事件序列:
是指从手指接触屏幕,到手指离开屏幕的那一刻结束。
这个过程所产生的一系列事件,这个事件序列以down事件开始,
中间有数量不定的move事件,最终up事件结束。
顶级View 一般来说就是ViewGroup即在activity中通过setContentView()所设置的view.

一、点击事件的传递规则:
当一个点击事件产生后,它的传递过程遵循此顺序:
activity—- window—–顶级view
顶级view接收到事件后,就会按事件分发机制分发事件。
事件的传递总是由外向内,事件总是先传递给父元素,然后由父元素分发给子view,但是通过requestDisallowInterceptTouchEvent()方法可以在子元素中干预父元素的事件分发过程,ANTION_DOWN事件除外。
我们要分析的对象时MotionEvent,即点击事件:
点击事件的事件分发就是对MotionEvent事件分发过程,即一个点击事件发生后,系统需要把这个事件传递给一个具体的view,而这个传递过程就是事件分发过程。点击事件的分发过程由三个重要的方法一起完成:
1.dispatchTouchEvent(MotionEvent ev)
用来对事件进行分发,如果事件能够传递给当前的view,那么此方法一定会被调用,返回结果受onTouchEvent和下级view的dispatchTouchEvent方法影响,表示是否消耗当前事件。
2.onInterceptTouchEvent(MotionEvent ev)
此方法在上述方法内部调用,判断是否拦截某个事件,如果当前View拦截了事件,那么在同一事件序列当中,此方法不会再被调用,返回结果表示是否拦截当前事件。
3.onTouchEvnet(MotionEvent ev)
此方也是在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,在同一事件序列中,当前view无法再接收到事件。

上述方法之间的关系:
public boolean dispatchTouchEvent(MotionEvent event ){
boolean consume = false;
if (onInterceptTouchEvent ( event )){
consume = onTouchEvent;
} else {
consume = child.dispatchTouchEvent(event);
}

}
通过上述代码,我们也可以了解点击事件的传递规则:
对于一个根ViewGroup,当一个点击事件产生后,事件会先传递给它,
那个它的dispatchTouchEvent()会被调用,如果它的onInterceptTouchEvent() 方法返回true,说明当前viewGroup要拦截事件,那么它的onTouchEvent()方法就会被调用;如果onInterceptTouchEvent()方法返回false,表示viewGroup不拦截事件,也就不处理当前事件,事件就会继续传递给子view,子View的dispatchTouchEvent() 方法就会被调用,如此反复直至事件被最终处理。
备注:VeiwGroup默认不拦截任何事件。viewGroup的onInterceptTouchEvent() 方法默认返回false.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值