2012-04-12 35 views
5

Tôi đang cố sử dụng Scroller để di chuyển đến vị trí cố định. Vấn đề của tôi là: nó kết thúc ở vị trí chính xác, nhưng nó hoặc là chỉ chạy một lần và thiết lập vị trí kết thúc ngay lập tức hoặc cuộn rất chậm đầu tiên và sau đó nhảy đến cùng.Android Scroller fling đến vị trí cố định

EDIT: vấn đề có vẻ là a) vận tốc của tôi bằng không đôi khi (đó là vấn đề ở một nơi khác :)) và tôi phải kéo dài thời lượng sử dụng scroller.extendDuration(). Tuy nhiên tôi không chắc chắn về những gì thời gian nên được. Tôi không thể tìm thấy thông tin về vận tốc nhất định thực sự có ý nghĩa gì. Có phải là pixel trên giây?

Dưới đây là mã của tôi:

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

Cách tính toán vận tốc và bạn đang thực hiện chức năng cuộn này trên tương tác của người dùng, như di chuyển cảm ứng – Triode

+0

Cách tính toán vận tốc và bạn cũng đang thực hiện chức năng cuộn này trên tương tác của người dùng. nếu đó là trường hợp thì tại sao bạn không thể sử dụng một số điều như thế này cuối cùng int delta = newX - getScrollX(); mScroller.startScroll (getScrollX(), 0, delta, 0, Math.abs (delta)); newX là vị trí hiện tại của chuột. Và bạn cũng có thể sử dụng trình theo dõi vận tốc để kiểm tra tốc độ di chuyển của cảm ứng. – Triode

+0

Có Tôi đang sử dụng một VelocityTracker, nhưng tôi đã tìm ra vấn đề là gì (xem câu trả lời dưới đây). Cảm ơn! –

Trả lời

2

Được rồi tôi đã nhận nó. Thật vậy, tôi đã phải kéo dài thời gian của mình (tuy nhiên tài liệu có chút sai lệch - đó không phải là giá trị được thêm vào thời lượng tính toán hiện tại, đó là thời lượng thực tế mới).

Sau khi đọc thêm một chút tài liệu tôi đã nhận ra rằng vận tốc cần thiết thực sự là pixel trên giây và tôi đã thực sự xác định VelocityTracker để sử dụng đơn vị này.

Vì vậy, đây là dòng thiếu:

scroller.extendDuration ((int) (Math.abs (OffsetX)/(float) Math.max (1000, Math.abs (initialVelocity)) * 1000));

Các vấn đề liên quan