Mobile/Android
[Android]Scroller의 getCurrX와 getCurrY의 결정되는 방식
out of coding
2014. 9. 25. 15:37
현재 스크롤되는 위치를 계산해서 돌려주는 방식이 좀 궁금하였다.
Scroller.startScroll와 Scroller.computeScrollOffset()에 내용이 존재한다.
Scroller.startScroll(int startX, int startY, int dx, int dy, int duration){ ... mDuration = duration; ... mDurationReciprocal = 1.0f / (float) mDuration; ... } Scroller.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; ... }
모든 시간의 기준은 1/1000이 된다.
startScroll을 통하여 scroll이 시작되게 되는데, 처음에 duration을 받게되면, 그것을 Reciprocal을 구하도록 한다.
이 값을 가지고, 전체 시간에서 얼마정도 진행이 되었는지를 확인할수 있다.
아주 쉬운 개념은 duration을 1000으로 주게 된다면, 1/1000이므로, 진행되는 단위가 이렇게 되는것이다.
이 수치를 계산하는 이유가 Interpolator의 getInterpolation을 구하는 부분에서 진행된 비율이 들어가야 하기 때문이다. (0.0~1.0 사이의 값)
getInterpolation이 하는 일은 자신의 interpolation에 대해서, animation의 좌표를 계산하여 주는 역할을 한다.
위의 소스처럼 x 값을 넣어주게 되면, x값을 가져오게 되는, 진행된 비율에 따른 animation의 값을 정하여 주는것이다.
EX) 끝에서 빠르게, 끝에서 느리게 등등...
return되어서 나오는 x의 값도 %값이라 생각하면 되는데, 이 값에 총 거리를 곱하면 진행되는 거리가 나오게 되고,
다시 이 값을 시작하는 Position에 더하여 주어서 CurrX와 CurrY값이 결정되는 것이다.