【问题标题】:NestedScrollView and onInterceptTouchEventNestedScrollView 和 onInterceptTouchEvent
【发布时间】:2015-09-21 15:38:54
【问题描述】:

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

onTouchEvent 中的 pointerId=-1 无效

在触发 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);
}

【问题讨论】:

    标签: android touch-event nestedscrollview


    【解决方案1】:

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

    @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
      }
    
      ...
    }
    

    【讨论】:

    • 感谢分享您的解决方案!
    猜你喜欢
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多