探究View的事件分发

探究View的事件分发

关注点:dispatchTouchEvent onInterceptTouchEvent onTouchEvent

ViewGroup继承View,包含view,当我们点击view的时候,究竟怎么向上传递事件的呢?

1.触发点击View.setOnClickListener()

if (!isClickable()) {
            setClickable(true);
        }
getListenerInfo().mOnClickListener = l;
View持有一个监听事件组ListenerInfo添加事件,点击传递的是MotionEvent 对象

2.DispatchTouchEvent开始事件传递

public boolean dispatchTouchEvent(MotionEvent event) {
    ...

    boolean result = false;

    if (onFilterTouchEventForSecurity(event)) {
        //noinspection SimplifiableIfStatement
        ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnTouchListener != null
                && (mViewFlags & ENABLED_MASK) == ENABLED
                && li.mOnTouchListener.onTouch(this, event)) {
            result = true;
        }

        if (!result && onTouchEvent(event)) {
            result = true;
        }
    }
    ...

    return result;
}


首先判断是否有设置touch事件及view是否为enable,恒定为true,当onTouch事件返回true时,dispatchTouchEvent返回true,该事件被消费。
由此可以确定OnTouchListener事件优先级较高。当OnTouch返回false时,事件进入onTouchEvent判断


3.OnTouchEvent

public boolean onTouchEvent(MotionEvent event) {
...
if ((viewFlags & ENABLED_MASK) == DISABLED) {
    if (event.getAction() == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) {
        setPressed(false);
    }
    // A disabled view that is clickable still consumes the touch
    // events, it just doesn't respond to them.
    return (((viewFlags & CLICKABLE) == CLICKABLE ||
            (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
}
... if (((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) { switch (event.getAction()) { case MotionEvent.ACTION_UP: if (!focusTaken) { if (mPerformClick == null) { mPerformClick = new PerformClick(); } if (!post(mPerformClick)) { performClick(); } } } break; ...... } return true; } return false;}
当(viewFlags & CLICKABLE) == CLICKABLE 即view不可用返回true,虽然有设置点击事件,但是不可用,确定为消费。
performClick确定最后是否消费


4.performClick

public boolean performClick() {
    final boolean result;
    final ListenerInfo li = mListenerInfo;
    if (li != null && li.mOnClickListener != null) {
        playSoundEffect(SoundEffectConstants.CLICK);
        li.mOnClickListener.onClick(this);
        result = true;
    } else {
        result = false;
    }

    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
    return result;
}
回调onClick方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值