2012-04-12 4 views
5

Scroller를 사용하여 고정 위치로 이동하려고합니다. 내 문제는 : 그것은 올바른 위치에 끝나지 만 그냥 한 번 실행하고 끝 위치를 즉시 설정하거나 매우 느리게 스크롤 한 다음 끝까지 이동합니다.Android Scroller 고정 위치로 이동

편집 : 문제는) 내 속도가 때때로 제로 (즉, 다른 곳에서 문제입니다 :)) 인 것 같다 내가 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)); newX는 현재 마우스를 위로 향하게합니다. 또한 속도 추적기를 사용하여 터치 이동 속도를 확인할 수 있습니다. – Triode

+0

예 VelocityTracker를 사용하고 있지만 문제가 무엇인지 알아 냈습니다 (아래 답변 참조). 감사! –

답변

2

좋아요. 실제로 필자는 내 기간을 연장해야했습니다 (그러나 문서는 약간 오도 된 것입니다. 현재 계산 된 기간에 추가 된 값이 아니며 실제로 새로운 기간입니다).

조금 더 많은 문서를 읽은 후에 필요한 속도가 실제로 초당 픽셀 수임을 알았고 실제로이 장치를 사용하기 위해 VelocityTracker를 정의했습니다.

scroller.extendDuration ((INT) (Math.abs (offsetX)/(플로트) Math.max (1000 Math.abs (initialVelocity)) *

그래서이 누락 라인 1000));

관련 문제