Android事件(一)

 
1.dispatchTouchEvent 返回结果true或者false
--ViewGroup:当一个Touch事件(触摸事件为例)到达根节点,即Acitivty的ViewGroup时,它会依次下发,下发的过程是调用子View(ViewGroup)的dispatchTouchEvent方法实现的。简单来说,就是ViewGroup遍历它包含着的子View,调用每个View的dispatchTouchEvent方法,而当子View为ViewGroup时,又会通过调用ViwGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。上述例子中的消息下发顺序是这样的:①-②-⑤-⑥-⑦-③-④。dispatchTouchEvent方法只负责事件的分发,它拥有boolean类型的返回值,当返回为true时,顺序下发会中断。在上述例子中如果⑤的dispatchTouchEvent返回结果为true,那么⑥-⑦-③-④将都接收不到本次Touch事件(任何方法都不能调用)
a.判断条件,执行OnTouchEvent (如果事件由此控件处理则不再执行onInterceptTouchEvent方法)
 
b.dispatchTouchEvent 也调用自己的onInterceptTouchEvent
c.intercepted是onInterceptTouchEvent的返回,如果返回true则将所有的下发操作拦截,返回false则继续下发
d.调用子类的dispatchTouchEvent,如果子类dispatch返回true则其他控件都收不到事件了 (包括未调用的同等级,同等级下级,自己下级)
e.调用ViewGroup中的dispatchTransformedTouchEvent方法传入null
 
f.dispatchTransformedTouchEvent方法如果child为null调用继承于View的dispatchTouchEvent,不为null调用孩子的 dispatchTouchEvent
--View:dispatchTouchEvent方法,并不执行分发工作,或者说它分发的对象就是自己,决定是否把touch事件交给自己处理,而处理的方法,便是onTouchEvent事件,事实上子View的dispatchTouchEvent方法真正执行的代码是这样的
注:View中如果注册了OnTouchListenr则调用Listener的onTouch,否则调用onTouchEvent
 
一般情况下,我们不该在普通View内重写dispatchTouchEvent方法,因为它并不执行分发逻辑。当Touch事件到达View时,我们该做的就是是否在onTouchEvent事件中处理它。
 
2.onInterceptTouchEvent
ViewGroup:直接返回false
 
View:无此方法
 
3.onTouchEvent
ViewGroup:DOWN MOVE UP事件处理 调用的View
View:DOWN MOVE UP事件处理 (每个Android原生控件都复写了onTouchEvent)
如果onTouchEvent 返回false 则View的onTouchEvent 会处理DOWN MOVE UP事件
如果onTouchEvent 返回true  则View的onTouchEvent 会处理DOWN一次事件
 
4.OnTouchListenr
如果OnTouchListener 返回false 则View中的dispatchTouchEvent会去调用View的onTouchEvent
如果OnTouchListener 返回true 则View中的dispatchTouchEvent不会去调用View的onTouchEvent
 
onInterceptTouchEvent:
DOWN返回false MOVE或者UP返回true 则MOVE或者UP事件再次传递下去是变为CANCEL事件,并且下次事件不再传递下去(比如MOVE返回true下次的MOVE或UP不再继续传递下去)
DOWN返回true 事件不会继续传递下去 
 
onTouchEvent中第一次DOWN事件返回的值才起作用,其他时候MOVE或UP返回true或者false不管用
DOWN返回false 事件继续上传
DOWN返回true  以后事件都由自己处理,不再上传,(如果是ViewGroup的onTouchEvent,下次事件不会调用这个ViewGroup的onInterceptTouchEvent)
 
如果自定义的ViewGroup控件的OnTouchEvent事件返回的是true,事件发生时DOWN会一直传递下去,是一种递归的形式,执行完子控件的onTouchEvent事件后,执行自己的onTouchEvent事件是如果DOWN返回true则以后的所有事件不再传递下去直接由他处理
如果自定义的ViewGroup控件的OnTouchEvent事件返回的是true,并且他有子控件的onTouchEvent事件返回true,以后的事件还是由子控件处理
 
5.OnClickListener
View:onTouchEvent方法
 
 
View:performClick方法
View:setOnClickListener方法
 
View:setClickable方法
 
如果注册了监听器,onTouchEvent方法中Up事件处理会调用OnClickListener。猜测如果控件注册了OnClickListener在View的OnTouchEvent方法中会返回true否则false
由10288行代码可知CLICKABLE标志位使能则返回true
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值