2012-04-12 2 views
5

Я пытаюсь использовать Скроллер для перехода в фиксированное положение. Моя проблема заключается в том, что она заканчивается в правильном положении, но она либо просто запускается один раз, либо сразу устанавливает конечную позицию, либо сначала прокручивается очень медленно, а затем перескакивает до конца.Android Scroller перешел в фиксированное положение

EDIT: проблема, кажется, что а) моя скорость равна нулю, иногда (это проблема где-то еще :)) и что я должен продлить срок с помощью scroller.extendDuration(). Однако я не уверен, что такое продолжительность. Я не могу найти никакой информации о том, что означает определенная скорость. Это пикселы в секунду?

Вот мой код:

private class Flinger implements Runnable { 

    private final Scroller scroller; 

    private int lastX = 0; 

    public Flinger() { 
     scroller = new Scroller(getContext()); 
    } 

    void startFling(int initialVelocity, int offsetX) { 
     Log.d("test", "finalX = " + offsetX); 
     if (offsetX > 0) { 
      scroller.fling(0, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0); 
      scroller.setFinalX(offsetX); 
      lastX = 0; 
     } else { 
      scroller.fling(getWidth(), 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0); 
      scroller.setFinalX(getWidth() + offsetX); 
      lastX = getWidth(); 
     } 
     post(this); 
    } 

    @Override 
    public void run() { 
     if (scroller.isFinished()) { 
      Log.d("test", "scroller finished"); 
      return; 
     } 

     boolean more = scroller.computeScrollOffset(); 
     int x = scroller.getCurrX(); 
     int diff = lastX - x; 
     Log.d("test", "isFlinging, x=" + x + ", diff=" + diff + ", leftOffset=" + getLeftOffset() + ", isDone=" + !more); 
     if (diff != 0) { 
      setLeftOffset(getLeftOffset() - diff); 
      lastX = x; 
     } 

     if (more) { 
      post(this); 
     } 
    } 
} 
+0

Как вы вычисления скорости, а также вы делаете это прокруткой функциональность на взаимодействие с пользователем, как прикосновение двигаться – Triode

+0

Как вы вычисления скорости, а также вы делаете это прокруткой функциональность на взаимодействие с пользователем, как сенсорный шаг если это так, то почему вы не можете использовать что-то вроде этого final int delta = newX - getScrollX(); mScroller.startScroll (getScrollX(), 0, delta, 0, Math.abs (delta)); новыйX - текущая позиция мыши. А также вы можете использовать ускоритель скорости, чтобы проверить скорость движения касания. – Triode

+0

Да, я использую VelocityTracker, но я выяснил, в чем проблема (см. Ответ ниже). Благодаря! –

ответ

2

Хорошо я получил его. Действительно, мне пришлось продлить мою продолжительность (однако документация немного вводит в заблуждение - это не значение, которое добавляется к текущей рассчитанной длительности, это фактическая новая продолжительность).

После прочтения немного дополнительной документации я понял, что требуемая скорость действительно составляет пиксели в секунду, и я фактически определил VelocityTracker для использования этого устройства.

Так что это недостающее линия:

scroller.extendDuration ((INT) (Math.abs (OffsetX)/(с плавающей точкой) Math.max (1000, Math.abs (initialVelocity)) * 1000));

 Смежные вопросы

  • Нет связанных вопросов^_^