android - NestedScrollView 和 onInterceptTouchEvent

标签 android touch-event nestedscrollview

我确实扩展了 NestedScrollView 和 @Override 它的方法:onTouchEventonInterceptTouchEvent。问题是 super.onTouchEvent 永远不会调用 ACTION_DOWN (它是由我的 onIntereceptTouchEvent 调用的),因此 NestedScrollView 不会移动,并且出现错误:

Invalid pointerId=-1 in onTouchEvent

触发ACTION_DOWN时,在NestedScrollView的onTouchEvent方法中设置指针id。

mActivePointerId = MotionEventCompat.getPointerId(ev, 0);

我自己无法设置这个,重写整个 onTouchEvent 方法似乎是一个痛苦的计划。可以在这里使用帮助。当我单击不监听触摸事件的 View 时,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);
}

最佳答案

下面是解决我的问题的代码,我不得不撒谎:

@Override
public boolean onTouchEvent(MotionEvent ev) {
    Log.i(LOGTAG, "onTouchEvent");
    if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
        mIsBeingDragged = true;
    }

    if (mFirstOnTouchEvent) {
        ev.setAction(MotionEvent.ACTION_DOWN);
        ev.setLocation(mStartX, mStartY);
        mFirstOnTouchEvent = false;
    }

    return super.onTouchEvent(ev);
}

并在onInterceptTouchEvent中触发ACTION_DOWN时将mFirstOnTouchEvent设置为true:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
  if (MotionEventCompat.getActionMasked(ev) == MotionEvent.ACTION_DOWN) {
    mFirstOnTouchEvent = true
  }

  ...
}

关于android - NestedScrollView 和 onInterceptTouchEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32699268/

相关文章:

android - 如何将 facebook api 中的日期转换为 android 应用程序日期格式

android - 在 LinearLayout 上实现 OnTouchListener - Android 开发

android - 使用嵌套 ScrollView 问题的响应式设计

android - 使用 Room 数据库中的数据复制表

java - 在水平 LinearLayout 中膨胀垂直线性布局返回宽度和高度 0

android - 通过绑定(bind)单击提交时从 ViewModel 中清除 EditText

ios - UIView 动画阻止触摸事件?

java - 如何根据用户的触摸移动图像?

android - NestedScrollView 内的 RecyclerView 导致 RecyclerView 膨胀所有元素

android - 嵌套 ScrollView 中的 Recyclerview