如何获得ListView上的滚动速度?


问题内容

我有一个带有onScrollStateChanged和onScroll事件侦听器的ListView。我希望能够获得ListView的滚动速度,或者以某种方式在某个事件侦听器中获得已启动滚动的finalX位置。我们的应用定位到SDK版本7。

我需要测量或获取ListView滚动的速度。


问题答案:

划分第一个可见项时差对时差不是一个好的解决方案。OnScroll侦听器每隔固定的时间周期接收一次onScroll事件,因此在大多数情况下,除法结果将为“
0”。

因此,您可以尝试执行以下操作:

private OnScrollListener onScrollListener = new OnScrollListener() {

    private int previousFirstVisibleItem = 0;
    private long previousEventTime = 0;
    private double speed = 0;

    @Override
    public void onScroll(HtcAbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {

        if (previousFirstVisibleItem != firstVisibleItem){
            long currTime = System.currentTimeMillis();
            long timeToScrollOneElement = currTime - previousEventTime;
            speed = ((double)1/timeToScrollOneElement)*1000;

            previousFirstVisibleItem = firstVisibleItem;
            previousEventTime = currTime;

            Log.d("DBG", "Speed: " +speed + " elements/second");
        }

    }

    @Override
    public void onScrollStateChanged(HtcAbsListView view, int scrollState) {
    }
};