浅谈ondraw先执行,还是onClick执行(详解)

  

有一个按钮按钮,要想为该按钮设置onClick事件和ondraw事件

        mTestButton。setOnClickListener(新View.OnClickListener () {   @Override   公共空间>   公共布尔dispatchTouchEvent (MotionEvent事件){   如果(mOnTouchListener !=零,,(mViewFlags和;启用ENABLED_MASK)==,,   mOnTouchListener。ondraw(事件)){   返回true;   }   返回>   公共布尔>   公共布尔performClick () {   sendAccessibilityEvent (AccessibilityEvent.TYPE_VIEW_CLICKED);   如果(mOnClickListener !=null) {   playSoundEffect (SoundEffectConstants.CLICK);   mOnClickListener.onClick(这个);   返回true;   }   返回错误;   }   之前      

从上述代码可以看的到,只要mOnClickListener不是null,就会去调用它的onClick方法,那mOnClickListener又是在哪里赋值的呢?经过分析后找到如下方法:

        公共空间setOnClickListener OnClickListener (l) {   如果(! isClickable ()) {   setClickable(真正的);   }   mOnClickListener=l;   }   之前      

而上述这个方法就是我们在应用程序层经常使用的方法,即我们给按钮设置点击事件的时候就会调用该方法了,分析到这了,我们知道了OnClick方法确实是在OnTouchEvent方法中,那么除了要设置OnClickListener,调用OnClick的条件又是什么呢?我们从38行代码往前推,从第14行可以分析出:

  

只要该控件是可点击的或者是长按类型的,则会进入到MotionEvent。ACTION_UP这个分支当中,然后经过各种条件判断,则会进入到38行的performClick()方法中。

  

至此,一切都清晰明白了!当我们通过调用setOnClickListener方法来给控件注册一个点击事件时,就会给mOnClickListener赋值,然后每当控件被点击时或者长按时,都会在performClick()方法里回调被点击控件的onClick方法。

  

  

关于OnTouchEvent (MotionEvent事件)事件的层级传递,我们都知道如果给一个控件注册了触摸事件,每次点击它的时候都会触发一系列的ACTION_DOWN, ACTION_MOVE, ACTION_UP等事件。这里需要注意,如果你在执行ACTION_DOWN的时候返回了假,后面一系列其它的行动就不会再得到执行了。简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个动作返回真,才会触发后一个行动。

  

那我们可以换一个控件,将按钮替换成ImageView,然后给它也注册一个触摸事件,并返回错误的。

  

以上这篇浅谈ondraw先执行,还是onClick执行(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

浅谈ondraw先执行,还是onClick执行(详解)