我确实扩展了 NestedScrollView 和 @Override 它的方法:onTouchEvent和onInterceptTouchEvent。问题是 super.onTouchEvent 从不调用 ACTION_DOWN (它由我的 onIntereceptTouchEvent 调用),因此 NestedScrollView 没有移动,我得到错误:
onTouchEvent 中的 pointerId=-1 无效
在触发 ACTION_DOWN 时,在 NestedScrollView 的 onTouchEvent 方法中设置了指针 id。
mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
我自己无法设置,重写整个 onTouchEvent 方法似乎是一个痛苦的计划。可以在这里使用帮助。当我单击不侦听触摸事件的视图时,NestedScrollView 确实会移动(基本上就是这样,我的 onInterecptTouchEvent 方法没有被调用,并且 ACTION_DOWN 在 NestedScrollView onTouchEvent 中处理)。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i(LOGTAG, String.valueOf(ev.getAction()));
final int action = MotionEventCompat.getActionMasked(ev);
if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
mIsBeingDragged = false;
Log.i(LOGTAG, "is scrolling" + String.valueOf(mIsBeingDragged));
return false; // Do not intercept touch event, let the child handle it
}
switch (action) {
case MotionEvent.ACTION_DOWN: {
mStartY = ev.getY();
break;
}
case MotionEvent.ACTION_MOVE: {
if (mIsBeingDragged) {
return true;
}
final int yDiff = calculateDistanceY(ev);
Log.d(LOGTAG, "y difference: y");
if (yDiff > mTouchSlop) {
mIsBeingDragged = true;
return true;
}
break;
}
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.i(LOGTAG, "onTouchEvent");
if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
mIsBeingDragged = false;
}
return super.onTouchEvent(ev);
}