首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NestedScrollView和onInterceptTouchEvent

NestedScrollView和onInterceptTouchEvent
EN

Stack Overflow用户
提问于 2015-09-21 15:38:54
回答 1查看 2.5K关注 0票数 2

我确实扩展了NestedScrollView和@重写它的方法:、onTouchEvent、问题是super.onTouchEvent从不调用ACTION_DOWN (这是由我的onIntereceptTouchEvent调用的),因为NestedScrollView不移动,所以我得到了错误:

onTouchEvent中无效的pointerId=-1

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

代码语言:javascript
复制
mActivePointerId = MotionEventCompat.getPointerId(ev, 0);

我无法亲自设置它,重写整个onTouchEvent方法似乎是痛苦的计划。这里可能需要帮助。当我单击“视图”(它不监听触摸事件)时,NestedScrollView确实会移动(基本上是这样,我的onInterecptTouchEvent方法没有被调用,ACTION_DOWN是在NestedScrollView onTouchEvent中处理的)。

代码语言:javascript
复制
@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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-22 06:12:15

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

代码语言:javascript
复制
@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);
}

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

代码语言:javascript
复制
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
  if (MotionEventCompat.getActionMasked(ev) == MotionEvent.ACTION_DOWN) {
    mFirstOnTouchEvent = true
  }

  ...
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32699268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档