[컴][안드로이드] animation loop


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();
 ...
}

댓글 없음:

댓글 쓰기