还记得第一篇文章我们要解决的问题吗?
java.lang.IllegalArgumentException
Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter e1
或许你脑子里已经有完整的思路了,没错就是在ScrollView的onIntercepte中进行拦截,方法思路为
- 当MouseDown的时候记录当前点击鼠标的X和Y坐标
- 如果这个时候产生了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事件,好了好了不说了,你愿意的话可以接下来继续讨论,就送到这了。