gpt4 book ai didi

android - 嵌套 ScrollView 和 onInterceptTouchEvent

转载 作者:搜寻专家 更新时间:2023-11-01 07:52:38 27 4
gpt4 key购买 nike

我确实扩展了 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 - 嵌套 ScrollView 和 onInterceptTouchEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32699268/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com