Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 滚动侦听器-向下滚动的第一距离始终为负值?_Android - Fatal编程技术网

Android 滚动侦听器-向下滚动的第一距离始终为负值?

Android 滚动侦听器-向下滚动的第一距离始终为负值?,android,Android,我有一个GestureDetector.onTestureListener连接到一个ListView。当用户向下滚动时,我尝试侦听滚动事件: private GestureDetector.OnGestureListener mOnGesture = new GestureDetector.OnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float di

我有一个GestureDetector.onTestureListener连接到一个ListView。当用户向下滚动时,我尝试侦听滚动事件:

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;
    }

}