如何在列表视图上获得滚动速度?

2022-09-02 01:38:03

我有一个ListView,带有onScrollStateChanged和onScroll事件侦听器。我希望能够获得ListView的滚动速度,或者以某种方式获取某些事件侦听器中启动的滚动的最终X位置。我们的应用面向 SDK 版本 7。

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


答案 1

划分第一可见项目在时间差上的差异不是一个好的解决方案。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) {
    }
};

答案 2

试试看:

private class SpeedMeterOnScrollListener implements OnScrollListener {

    private long timeStamp;
    private int lastFirstVisibleItem;

    public SpeedMeterOnScrollListener() {
        timeStamp = System.currentTimeMillis();
        lastFirstVisibleItem = 0;
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        long lastTime = System.currentTimeMillis();
        //calculate speed by firstVisibleItem, lastFirstVisibleItem, timeStamp and lastTime
        timeStamp = lastTime;
        lastFirstVisibleItem = firstVisibleItem;
    }

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

推荐