有一个按钮按钮,要想为该按钮设置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执行(详解)