Android事件分发机制2--自定义事件分发流

还记得第一篇文章我们要解决的问题吗?

java.lang.IllegalArgumentException

Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter e1

 或许你脑子里已经有完整的思路了,没错就是在ScrollView的onIntercepte中进行拦截,方法思路为

  1. 当MouseDown的时候记录当前点击鼠标的X和Y坐标
  2. 如果这个时候产生了MouseMove再次获取鼠标的X和Y坐标和之前记录的进行对比,如果发生了变化就判定这是一个拖动过程,果断返回True进行拦截不需要View进行处理了。
override  fun  onInterceptTouchEvent(ev: MotionEvent):Boolean
{
    when(ev.action)
    {
        MotionEvent.ACTION_DOWN->{
            startDownX = ev.rawX;
            startDownY = ev.rawY;
        }
        MotionEvent.ACTION_MOVE->{
            //如果产生了移动
            if(startDownX!= ev.rawX || startDownY!=ev.y)
            {
                return true;
            }
        }
        MotionEvent.ACTION_UP->{}
        MotionEvent.ACTION_CANCEL->{}

    }
  return  super.onInterceptTouchEvent(ev);
}

 重新运行程序没问题了哦,掌握以后这下可以轻松完美的解决各种事件冲突了。

接下来让我们给ScrollView的Child加上OnTuchEvent的事件来观察打印情况。

override fun onTouchEvent(event: MotionEvent?): Boolean
{
    when(event?.action)
    {
        MotionEvent.ACTION_DOWN->{Log.d("ButtonSTouchEvent","ACTION_DOWN");}
        MotionEvent.ACTION_MOVE->{    Log.d("ButtonSTouchEvent","ACTION_MOVE");}
        MotionEvent.ACTION_UP->{Log.d("ButtonSTouchEvent","ACTION_UP");}
        MotionEvent.ACTION_CANCEL->{    Log.d("ButtonSTouchEvent","ACTION_CANCEL");}
    }
    return super.onTouchEvent(event)
}
override fun dispatchTouchEvent(event: MotionEvent?): Boolean
{
    when(event?.action)
    {
        MotionEvent.ACTION_DOWN->{    Log.d("ButSTouchdispatchEvent","ACTION_DOWN");}
        MotionEvent.ACTION_MOVE->{    Log.d("ButSTouchdispatchEvent","ACTION_MOVE");}
        MotionEvent.ACTION_UP->{    Log.d("ButSTouchdispatchEvent","ACTION_UP");}
        MotionEvent.ACTION_CANCEL->{    Log.d("ButSTouchdispatchEvent","ACTION_CANCEL");}
    }
    return super.dispatchTouchEvent(event)
}

当我们不拖动只是点击Button的时候输出

09-29 08:17:56.427 20788-20788/com.example.krcm110.myapplication D/ButSTouchdispatchEvent: ACTION_DOWN
09-29 08:17:56.427 20788-20788/com.example.krcm110.myapplication D/ButtonSTouchEvent: ACTION_DOWN
09-29 08:17:56.498 20788-20788/com.example.krcm110.myapplication D/ButSTouchdispatchEvent: ACTION_UP
09-29 08:17:56.499 20788-20788/com.example.krcm110.myapplication D/ButtonSTouchEvent: ACTION_UP

很漂亮的打印和我想的是一模一样。

然后我们观察拖动的时候的打印

09-29 08:20:19.434 20788-20788/com.example.krcm110.myapplication D/ButSTouchdispatchEvent: ACTION_DOWN
09-29 08:20:19.434 20788-20788/com.example.krcm110.myapplication D/ButtonSTouchEvent: ACTION_DOWN
09-29 08:20:19.468 20788-20788/com.example.krcm110.myapplication D/ButSTouchdispatchEvent: ACTION_CANCEL
09-29 08:20:19.468 20788-20788/com.example.krcm110.myapplication D/ButtonSTouchEvent: ACTION_CANCEL

你会发现拖动的时候事件Down后面的UP就被父容器拦截了并且Button触发了ACTION_CANCEL事件,好了好了不说了,你愿意的话可以接下来继续讨论,就送到这了。

猜你喜欢

转载自blog.csdn.net/krcm110/article/details/82895860
今日推荐