2012-04-12 41 views
5

我正在嘗試使用Scroller投擲到固定位置。我的問題是:它結束了正確的位置,但它只是運行一次,立即設置結束位置,或者先滾動非常緩慢,然後跳轉到結尾。Android Scroller投擲到固定位置

編輯:問題似乎是:a)我的速度有時爲零(這是其他地方的問題:)),我必須使用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 2012-04-12 11:50:10

+0

你是如何計算速度的,你是否在做這個滾動功能的用戶交互,比如觸摸移動如果是這樣的話,那麼爲什麼你不能使用這樣的東西呢? final int delta = newX - getScrollX(); mScroller.startScroll(getScrollX(),0,delta,0,Math.abs(delta)); newX是當前鼠標位置。還可以使用速度跟蹤器來檢查觸摸移動速度。 – Triode 2012-04-12 12:00:25

+0

是的,我正在使用VelocityTracker,但我已經找出問題所在(請參閱下面的答案)。謝謝! – 2012-04-12 12:51:29

回答

2

好吧我知道了。事實上,我不得不延長我的持續時間(但文檔有點誤導 - 這不是增加到當前計算持續時間的值,而是實際的新持續時間)。

在閱讀了更多文檔後,我意識到所需的速度實際上是每秒像素數,而且我已經定義了VelocityTracker來使用這個單元。

因此,這是缺少的行:

scroller.extendDuration((int)的(Math.abs(OFFSETX)/(浮點) Math.max(1000,Math.abs(initialVelocity))* 1000));