scroller class 를 이용하지 않고, scroll 을 구현하려 했다. 결론은 일단 실패이다. ㅜ.ㅜ
구현
구현은 아래의 루틴으로 이뤄져 있다.toggleSidebar() -> generating event -> event handler -> doAnimation()이 과정을 일정시간 마다 반복하게 하기 위해 아래 코드가 존재한다.
mHandler.postAtTime(new DoAnimate(), mCurrentAnimationTime);이유는 모르지만, 적어도 eumulation 내에서는 동작이 자연스럽지 않다. 원하는 frame 수가 채워지지 않는듯한 느낌이다.
scroll 을 이용해서 똑같은 동작을 구현해보니, 훨씬 부드럽게 동작한다. 나의 구현에 문제가 있는 듯도 하고, 아니면 scroll 이 훨씬 빠르게 처리될 수도 있다.
private final Handler mHandler = new Handler(); private void moveHandle(int position) { final View handle = mContent; final int left = handle.getLeft(); final int right = handle.getRight(); int deltaX = position - left; int screenWidth = this.getWidth(); int mContent_btnsize = 100; if ( screenWidth - mContent_btnsize < position) { deltaX = screenWidth - mContent_btnsize - left; } else if (0 > position) { deltaX = 0 - left; } handle.offsetLeftAndRight(deltaX); final Rect frame = mFrame; final Rect region = mInvalidate; handle.getHitRect(frame); region.set(frame); invalidate(region); } private void incrementAnimation() { long now = SystemClock.uptimeMillis(); float t = (now - mAnimationLastTime) / 1000.0f; // ms -> s final int position = mAnimationPosition; final float v = mAnimatedVelocity; // px/s final float a = mAnimatedAcceleration; // px/s/s int timePassed = (int) (now - mStartTime); // s = vt + (1/2)at^2 mAnimationPosition = position + (v * t) + (0.5f * a * t * t); // px mAnimatedVelocity = v + (a * t); // px/s mAnimationLastTime = now; // ms } private void doAnimation() { if (mAnimating) { incrementAnimation(); int button_size = 50; if (mAnimationPosition >= mContent.getWidth() - button_size) { mAnimating = false; openSidebarDraw(); } else { moveHandle((int) mAnimationPosition); mCurrentAnimationTime += ANIMATION_FRAME_DURATION; mHandler.postAtTime(new DoAnimate(), mCurrentAnimationTime); } } } public void toggleSidebar() { if(mState == SIDEBAR_CLOSE) { /** * send MSG_ANIMATE on every Frame duration. */ mStartTime = SystemClock.uptimeMillis(); mAnimationPosition = mContent.getLeft(); mSidebar.setVisibility(View.VISIBLE); long now = SystemClock.uptimeMillis(); mAnimationLastTime = now; mCurrentAnimationTime = now + ANIMATION_FRAME_DURATION; mAnimating = true; mHandler.postAtTime(new DoAnimate(), mCurrentAnimationTime); mAnimationPosition = mContent.getLeft(); moveHandle((int) mAnimationPosition); } } class DoAnimate implements Runnable{ @Override public void run() { doAnimation(); } }
http://stackoverflow.com/questions/5495855/android-scroller-animation/6219382#6219382
위 link 에서 scroller 를 이용한 fling class 를 구현했다.
protected boolean drawChild(Canvas canvas, View child, long drawingTime) { ... child.computeScroll(); ... }
댓글 없음:
댓글 쓰기