scroll 을 구현한 소스를 보면서 getCurrX(), getCurrY() 가 return 하는 값에 대한 궁금증이 생겨서 Scroll code 를 보게 되었다. 이 글에서는 대략적으로 어떤 값이 getCurrX(), getCurrY() 를 통해 return 되는지에 대해 얘기 하려 한다.
Scroller.computeScrollOffset()
android.widget.Scroller.java
startScroll(int startX, int startY, int dx, int dy, int duration){ ... mDuration = duration; ... mDurationReciprocal = 1.0f / (float) mDuration; ... } computeScrollOffset() { ... if (timePassed < mDuration) { switch (mMode) { case SCROLL_MODE: float x = timePassed * mDurationReciprocal; if (mInterpolator == null) x = viscousFluid(x); else x = mInterpolator.getInterpolation(x); mCurrX = mStartX + Math.round(x * mDeltaX); mCurrY = mStartY + Math.round(x * mDeltaY); break; ... }
참고로 여기서 모든 시간의 단위는 millisecond 이다.
startScroll 을 통해 scroll 을 시작하게 된다. 이 처음에 duration 을 받으면 그것의 역수(Reciprocal)를 취한다. 그러면 나중에 이 역수를 이용해서
소요시간(passed time)/전체 duration의 계산이 된다. 즉, 지금 시간이 전체시간에서 어느 정도 흘렀는지에 대한 파악이 된다. 한마디로 % (비율)를 구하려고 한다고 생각하면 될 것이다.
조금 어렵게(?) 설명하면, 분수의 개념을 잘 생각하면 된다. duration 으로 나누어서 역수를 얻는 것은 duration 을 "전체" 로 보는 것이고, 이 "전체" 를 '1' 로 보는 것이다. 그리고 이 "전체" 를 20 개로 쪼갠다. 그러면 1/20 이 뜻하는 바는 20개로 쪼갠 것중 1개이다.
이게 왜 필요한가 하면 getInterpolation(x) 함수의 parameter x 의 조건이 비율 값이 들어와야 하기 때문이다. 다시 말하면 0.0 ~ 1.0 사이의 값이 들어와야 한다는 이야기이다. 이 interpolator 가 하는 일을 대략 설명하자면, 약간의 추측을 보태서, 만약 우리가 아는 "관성 scrolling" 같은 animation 을 한다고 하였을 때, 그 animation 좌표를 계산하는 수고를 덜어주는 역할을 한다.(interpolator 와 관련 참고 할 만한 자료)
그러니까 x 로 들어가는 값이 전체 시간(duration) 중에 어느 정도의 시간이 흐른 것인지를 알려준다면, 그 흐른 시간에 해당하는 animation 값을 주는 것이다. 물론 이 때 이 animation 값도 % 로 return 해준다. 그래서 이 현재 값에 대한 % 값을 가지고, 총 가야 할 거리를 곱하면, 현재 값이 나오는 것이다.
이 값이 mCurrX, mCurrY 에 assign 되고, 이것이 getCurrX(), getCurrY() 를 통해 return 된다.
결론적으로 getCurrX() 와 getCurrY() 로 return 되는 값은 Interpolator 에 따라 결정되는 것이라고 할 수 있겠다. 다르게 표현하자면, animation 종류에 따라 결정된다고 볼 수 있겠다.
댓글 없음:
댓글 쓰기