티스토리 뷰

현재 스크롤되는 위치를 계산해서 돌려주는 방식이 좀 궁금하였다.


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값이 결정되는 것이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함