2013-07-01 3 views
0

У меня есть Скроллер, используемый для броска. Я инициализирую его с начальной скоростью и некоторыми ограничениями. Когда я позже получаю новое значение Y, getCurrY возвращает предел Y, переданный в fling.Scroller.getCurrY возвращает максимальное значение после прохода

Вот сильно упрощенный код:

public class SimpleList extends ScrollView implements Runnable 
{ 
    private VelocityTracker velocityTracker = null; // initialization redacted 
    private Scroller scroller = null; 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) 
    { 
    final int action = ev.getAction(); 
    switch (action & MotionEvent.ACTION_MASK) 
    { 
     case MotionEvent.ACTION_DOWN: 
     velocityTracker.addMovement (ev); 
     return true; 

     case MotionEvent.ACTION_MOVE: 
     { 
     velocityTracker.addMovement (ev); 
     return true; 
     } 

     case MotionEvent.ACTION_UP: 
     velocityTracker.computeCurrentVelocity (1000); 
     int index = ev.getActionIndex(); 
     int pointerId = ev.getPointerId(index); 
     int velY = (int) VelocityTrackerCompat.getYVelocity (velocityTracker, pointerId); 
     velocityTracker.recycle(); 

     scroller = new Scroller (getContext()); 
     scroller.fling (0, 0, 0, velY, 
         Integer.MIN_VALUE, Integer.MIN_VALUE, 
         Integer.MAX_VALUE, Integer.MAX_VALUE); 
     postDelayed (this, 100); 
     return true; 
    } 
    return false; 
    } 

    public void run() 
    { 
    if (scroller.isFinished()) 
     return; 

    if (scroller.computeScrollOffset()) 
    { 
     System.out.println ("curVel " + scroller.getCurrVelocity()); 
     System.out.println ("newY " + scroller.getCurrY()); 
    } 
    } 
} 

Начальная скорость кажется разумным - около 1000 точек/сек. Записанная скорость немного меньше, что также представляется разумным. Тем не менее, значением «newY» является MAX_VALUE, переданный в fling.

Любые идеи? Любые идеи?

+0

Даже если я просто касаюсь без движения (т. Е. Скорость равна 0), getCurrY все еще возвращает MAX_VALUE. Это должна быть какая-то невероятная ошибка, которую я делаю! –

ответ

1

Необходимо использовать OverScroller.

Документация для Скроллера мне не поняла - я думал, что значения min и max используются только для ограничения количества прокрутки. Однако они также используются для определения диапазона прокрутки, что означает, что computeScrollOffset использует ограничения для масштабирования анимации, а не только для ее ограничения.