NestedScrollView и onInterceptTouchEvent
Я расширяю NestedScrollView и @Override его методами: onTouchEvent и onInterceptTouchEvent. Проблема в том, что super.onTouchEvent никогда не вызывает ACTION_DOWN (он вызывается моим onIntereceptTouchEvent), и из-за этого NestedScrollView не перемещается, и я получаю ошибку:
Неверный pointerId=-1 в onTouchEvent
Идентификатор указателя устанавливается в методе onTouchEvent объекта NestedScrollView при запуске ACTION_DOWN.
mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
Я не могу установить это сам, переписывание целых методов onTouchEvent кажется болезненным планом. Могли бы использовать помощь здесь. NestedScrollView действительно перемещается, когда я нажимаю на View, который не прослушивает сенсорные события (в основном таким образом мой метод 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);
}
1 ответ
Ниже приведен код, который исправил мою проблему, я должен был лгать:
@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.i(LOGTAG, "onTouchEvent");
if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
mIsBeingDragged = false;
}
if (mFirstOnTouchEvent) {
ev.setAction(MotionEvent.ACTION_DOWN);
ev.setLocation(mStartX, mStartY);
mFirstOnTouchEvent = false;
}
return super.onTouchEvent(ev);
}
и установите mFirstOnTouchEvent в true, когда ACTION_DOWN запущен в onInterceptTouchEvent