view事件分发机制

参考:(http://blog.csdn.net/lmj623565791/article/details/38960443)
【总结】以button为例,
1、点击button(略微滑动一下)的过程中依次执行:
View.dispatchEven()——>View.onTouchListener()—->View.onTouchEven();
在dispatchEven()源码中进行判断onTouchListener是否为空且为true,如果在button.setOnTouchListener()方法中设置的return 值为true 则不再执行*view的onTouchEven方法。设为false则执行。重点内容*

相关源码:

/** 
     * Pass the touch screen motion event down to the target view, or this 
     * view if it is the target. 
     * 
     * @param event The motion event to be dispatched. 
     * @return True if the event was handled by the view, false otherwise. 
     */  
    public boolean dispatchTouchEvent(MotionEvent event) {  
        if (!onFilterTouchEventForSecurity(event)) {  
            return false;  
        }  

        if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
                mOnTouchListener.onTouch(this, event)) {  
            return true;  
        }  
        return onTouchEvent(event);  
    }  

2、在even从DOWN到MOVE到UP的过程中,通过两个标识判断是点击还是长按操作——PREPRESEED、PRESSEED。如果点击时间小于115毫秒或处于 115ms到 500ms之间会执行onClick方法;如果大于500ms 则有两种情况:
如果有OnLongClick方法,则执行长按方法,如果该方法内返回true则不再执行onCLick方法
如果没有OnLongClick方法或return 的是false则 会触发onClick方法。

Touch事件的ACTION_DOWN -> ACTION_UP -> OnClick/OnLongClick。

      **该View是怎么响应这个点击动作的呢?**

      首先,该View会先响应ACTION_DOWN事件,并返回一个boolean值,这里有两种判断:

            a:返回True,表示该View接受此按下动作,就是说这个点击动作的按下操作被中止,然后就是响应ACTION_UP事件。点击动作的按下操作被ACTION_DOWN接受之后就结束了,所以之后的OnClick/OnLongClick事件就不会响应了。

            b:返回false,表示该View不接受此按下动作,响应完之后,按下操作继续往下发,之后是响应ACTION_UP事件,这里又有一个判断:

如果ACTION_UP事件返回True,表示ACTION_UP接受松开操作,松开操作中止;View会一直处于按下状态,之后View便会响应OnLongClick事件。

如果ACTION_UP事件返回false,表示ACTION_UP不接收松开操作,松开操作继续下发;因为按下与松开操作都没有被中止,所以之后View就会响应OnClick事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值