5

私はGestureDetector.OnGestureListenerをListViewに接続しています。ユーザーが下にスクロールしているときにスクロールイベントをリッスンしようとしています。

private GestureDetector.OnGestureListener mOnGesture = new GestureDetector.OnGestureListener() {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    }
}

しかし、「distanceY」値の非常に奇妙な流れが見られます。

distanceY: -417.02252  // <-- huh?
e1: null
e2: MotionEvent{4097ac08 action=2 x=233.6657 y=417.02252 pressure=0.79999995 size=0.33333334}

distanceY: 1.5640259
e1: null
e2: MotionEvent{4097ac08 action=2 x=233.6657 y=415.4585 pressure=0.79999995 size=0.33333334}

distanceY: 1.5640259
e1: null
e2: MotionEvent{4097ac08 action=2 x=233.6657 y=413.89447 pressure=0.79999995 size=0.40000004}

... rest of values are positive, as expected ...

最初の「distanceY」値は負(予期しない)ですが、その後の値はすべて正です。これを説明できるのは何ですか?この動作を毎回再現できます。

ありがとう

4

2 に答える 2

1

distanceY現在のイベントと前のonScrollイベントの間の距離です。これは最初のそのようなイベントなので、ゼロから計算を開始すると思います。

distanceY: ____-417.02252____  // Same value as...
e1: null
e2: MotionEvent{4097ac08 action=2 x=233.6657 y=____417.02252____ // ...here...
于 2012-09-17T19:13:58.833 に答える
0

同じ問題があります。

しかし、私の場合、onInterceptTouchEvent(...)メソッドとonTouchEvent(...)メソッドに異なるOnGestureListenerを使用します。

したがって、実際のtouch-event-listenerに渡された最初のスクロールイベントを無視するために、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;
    }

}

私のために働く

于 2017-02-24T16:09:47.937 に答える