Android 滚动侦听器-向下滚动的第一距离始终为负值?
我有一个GestureDetector.onTestureListener连接到一个ListView。当用户向下滚动时,我尝试侦听滚动事件:Android 滚动侦听器-向下滚动的第一距离始终为负值?,android,Android,我有一个GestureDetector.onTestureListener连接到一个ListView。当用户向下滚动时,我尝试侦听滚动事件: private GestureDetector.OnGestureListener mOnGesture = new GestureDetector.OnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float di
private GestureDetector.OnGestureListener mOnGesture = new GestureDetector.OnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
}
}
但我看到一个非常奇怪的“距离”值流:
distance:-417.02252/distance
是当前和以前的onScroll
事件之间的距离。因为这是第一个这样的事件,我假设它从零开始计算
distanceY: ____-417.02252____ // Same value as...
e1: null
e2: MotionEvent{4097ac08 action=2 x=233.6657 y=____417.02252____ // ...here...
我也有同样的问题
但在我的例子中,我对onInterceptTouchEvent(…)和onTouchEvent(…)方法使用了不同的OnTestureListener-s
所以,我只是在intercept listener中设置了一个标志,用于忽略传递给实际触摸事件侦听器的第一个滚动事件
private class GestureInterceptListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
final boolean shouldIntercept = ...; // here we decide should we intercept this event, or should it be passed further
if (shouldIntercept) {
mGestureProcessListener.setFirstScrollEventIgnored(true);
}
return shouldIntercept;
}
}
private class GestureProcessListener extends GestureDetector.SimpleOnGestureListener {
private boolean ignoreFirstBuggyScrollEvent = false;
/**
* For some reason first scroll event on half-visible settings list gets strange incorrect negative values
* @param isIgnored - should next scroll event be ignored? value resets to false afterwards
*/
public void setFirstScrollEventIgnored(boolean isIgnored) {
ignoreFirstBuggyScrollEvent = isIgnored;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (ignoreFirstBuggyScrollEvent) {
ignoreFirstBuggyScrollEvent = false;
return true;
}
... // process scroll event here
return true;
}
}
对我有效这是有道理的,但从上面的输出来看,有没有办法检测到这种情况?例如,我想丢弃一个事件,但无法判断它是否只是第一个事件。我希望distanceX
和distanceY
都是负值MotionEvent
x
和y
值。检查两个总和是否都低于接近零(或总和等于零)的某个非常小的误差幅度,将为跳过第一个onScroll
事件提供相当好的可能性。这是我能想到的最好的方法。最后,我只是在一个触摸式听众中建立了自己的逻辑来处理这个问题。他们用这些价值观给你打电话让你很沮丧。你能告诉我你是怎么做到的吗?我也有同样的问题,问得好。我也有同样的问题
private class GestureInterceptListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
final boolean shouldIntercept = ...; // here we decide should we intercept this event, or should it be passed further
if (shouldIntercept) {
mGestureProcessListener.setFirstScrollEventIgnored(true);
}
return shouldIntercept;
}
}
private class GestureProcessListener extends GestureDetector.SimpleOnGestureListener {
private boolean ignoreFirstBuggyScrollEvent = false;
/**
* For some reason first scroll event on half-visible settings list gets strange incorrect negative values
* @param isIgnored - should next scroll event be ignored? value resets to false afterwards
*/
public void setFirstScrollEventIgnored(boolean isIgnored) {
ignoreFirstBuggyScrollEvent = isIgnored;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (ignoreFirstBuggyScrollEvent) {
ignoreFirstBuggyScrollEvent = false;
return true;
}
... // process scroll event here
return true;
}
}