欢迎大家访问我的个人网站 - Sunday俱乐部


在处理嵌套的View的滑动冲突的时候。

重写了,父容器的onInterceptTouchEvent 之后, return 的值被我人为的限定成(true false),并没有调用super.onInterceptTouchEvent。

这时,如果条件满足拦截下了Touch事件,就会进入父容器的onTouchEvent。

在该方法最后的返回值为:super.onTouchEvent(ev);

意味着,返回值是通过父类 的 onTouchEvent 计算得出的。

在父类的onTouchEvent 里面

case MotionEvent.ACTION_MOVE:
/*这里必定会取出-1.原因是因为在down事件的时候,onInterceptTouchEvent没有对activePointerIndex 进行合理赋值。*/
final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
if (activePointerIndex == -1) {
Log.e(TAG, "Invalid pointerId=" + mActivePointerId + " in onTouchEvent");
break;
}
Log.e(TAG,"Invalid pointerId="+ mActivePointerId +" in onTouchEvent");ndroid 4.4 就会输出这一句。

Invalid pointerId=-1 in onTouchEvent

而Android 4.4以下,很可能会输出:

java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:2148)

pointerIndex out of range

pointerIndex 不在合理范围之内,是因为其值为-1

只需要在父容器的onInterceptTouchEvent方法里面调用super.onInterceptTouchEvent(ev);方法就可以解决这个问题

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐