美文网首页
OnClickListener&onTouchEvent事件

OnClickListener&onTouchEvent事件

作者: coke613 | 来源:发表于2018-05-16 17:55 被阅读0次

    最近项目不是很紧张,决心研究下view中的事件,写下自己的心得。

    A·先明确OnClickListener是由onTouchEvent(MotionEvent event)方法解析出来的。
    B·Touch事件,先执行dispatchTouchEvent(MotionEvent event)分发,这里有一个优先级的问题。那就是onTouchEvent & OnTouchListener。

    我们主要看第二点,优先级的问题。

    public boolean dispatchTouchEvent(MotionEvent event) {
          ........省略部分代码
    
                ListenerInfo li = mListenerInfo;
                if (li != null && li.mOnTouchListener != null
                        && (mViewFlags & ENABLED_MASK) == ENABLED
                        && li.mOnTouchListener.onTouch(this, event)) {
                    return = true;
                }
          ........
                  return onTouchEvent(event);
        }
    
    

    如果自定义的View,重写onTouchEvent()方法,并且设置了OnTouchListener,会出现两种情况。

    1️⃣设置OnTouchListener,且OnTouchListener.onTouch()返回true,暂且先不看(mViewFlags & ENABLED_MASK) == ENABLED标识符,此时,执行return 语句,重写View的onTouchEvent(event)就无效了,因为OnTouchListener不为null && OnTouchListener.onTouch()返回true,满足if语句,执行return,结束方法体。
    2️⃣设置OnTouchListener,且OnTouchListener.onTouch()返回false,暂且先不看(mViewFlags & ENABLED_MASK) == ENABLED标识符,此时,不满足if语句,执行View.onTouchEvent(event);
    由此可见,OnTouchListener优先级是大于onTouchEvent优先级的。这样做的好处是方便外界处理点击事件。
    C·当OnTouchListener为null 或者OnTouchListener.onTouch()返回false,执行View.onTouchEvent(event),通过MotionEvent,解析点击事件。这里我们只看Up事件,因为在手势抬起的时候执行点击事件。
    public boolean onTouchEvent(MotionEvent event) {
      
           case MotionEvent.ACTION_UP:
                     .....  
                    if (!mHasPerformedLongPress && !mIgnoreNextUpEvent) {
                                // This is a tap, so remove the longpress check
                                removeLongPressCallback();
    
                                // Only perform take click actions if we were in the pressed state
                                if (!focusTaken) {
                                    // Use a Runnable and post this rather than calling
                                    // performClick directly. This lets other visual state
                                    // of the view update before click actions start.
                                    if (mPerformClick == null) {
                                        mPerformClick = new PerformClick();
                                    }
                                    if (!post(mPerformClick)) {
                                        performClick(); // 执行点击事件
                                    }
                                }
                            }
    
                            if (mUnsetPressedState == null) {
                                mUnsetPressedState = new UnsetPressedState();
                            }
    
                            if (prepressed) {
                                postDelayed(mUnsetPressedState,
                                        ViewConfiguration.getPressedStateDuration());
                            } else if (!post(mUnsetPressedState)) {
                                // If the post failed, unpress right now
                                mUnsetPressedState.run();
                            }
                     ....
                        break;
        在up事件中,其实在通过异步的方式尝试执行点击事件,如果异步失败,则同步执行。
    
    performClick()
    public boolean performClick() {
            final boolean result;
            final ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnClickListener != null) {
                playSoundEffect(SoundEffectConstants.CLICK);
                li.mOnClickListener.onClick(this); // 最终把事件丢给mOnClickListener
                result = true;
            } else {
                result = false;
            }        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
    
            notifyEnterOrExitForAutoFillIfNeeded(true);
    
            return result;
        }
    

    一张图总结:

    a.jpg

    相关文章

      网友评论

          本文标题:OnClickListener&onTouchEvent事件

          本文链接:https://www.haomeiwen.com/subject/joopdftx.html