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

Joo*_*ost 22 java android

我有一个带有onScrollStateChanged和onScroll事件监听器的ListView.我希望能够得到ListView控件或某种方式来获得一些事件侦听器的启动滚动的finalX位置的滚动速度.我们的应用程序针对SDK版本7.

我需要测量或获得ListView滚动的速度.

SSe*_*hko 17

划分第一个可见项目的时差差异不是一个好的解决方案.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) {
    }
};
Run Code Online (Sandbox Code Playgroud)


Qui*_*ick 5

试试吧:

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) {
    }
}
Run Code Online (Sandbox Code Playgroud)