ViewGroup的DispatchTouchEvent事件分发流程分析

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
   
    
        ...(进行Event是否正确的判断)
        
        boolean handled = false;
        if (onFilterTouchEventForSecurity(ev)) {
   
            final int action = ev.getAction();
            final int actionMasked = action & MotionEvent.ACTION_MASK;
            // Handle an initial down.
            if (actionMasked == MotionEvent.ACTION_DOWN) {
   
                // Throw away all previous state when starting a new touch gesture.
                // The framework may have dropped the up or cancel event for the previous gesture
                // due to an app switch, ANR, or some other state change.
                cancelAndClearTouchTargets(ev);
                resetTouchState();
            }
            ...Intercept处理及Dispatch处理)
        }
        if (!handled && mInputEventConsistencyVerifier != null) {
   
            mInputEventConsistencyVerifier.onUnhandledEvent(ev, 1);
        }
        return handled;
    }   

当Action为DOWN时,这里会调用cancelAndClearTouchTargets(ev)和resetTouchState(),将清掉mFirstTouchTarget。
这里需要了解TouchTarget的具体含义,尤其是在ViewGroup里的mFirstTouchTarget,它是这个ViewGroup里的一个单链表的表头引用,用来存储其下需要事件分发的view。
因此,这里是做一组新的事件分发的准备。

 /**
     * Resets all touch state in preparation for a new cycle.
     */
    private void resetTouchState() {
   
        clearTouchTargets();
        resetCancelNextUpFlag(this);
        mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
        mNestedScrollAxes = SCROLL_AXIS_NONE;
    }
    
   /**
     * Clears all touch targets.
     */
    private void clearTouchTargets() {
   
        TouchTarget target = mFirstTouchTarget;
        if (target != null) {
   
            do {
   
                TouchTarget next = target.next;
                target.recycle();
                target = next;
            } while (target != null);
            mFirstTouchTarget = null;
        }
    }

之后开始判断该Action是否是需要拦截touch的事件。
我们这里的Action为DOWN,mFirstTouchTarget为空,intercepted值为false;
这里intercepted仅当事件是DOWN且需要拦截时为true(如果是鼠标点击事件,也会为true)。

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
   
        ...
    	if (onFilterTouchEventForSecurity(ev)) {
   
    		...(清除单链表)
    	    // Check for interception.
            final 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值