/**
     * 描述:TODO
     *
     * @see java.lang.Runnable#run()
     * @author: zhaoqp
     * @date:2013-11-28 上午11:14:35
     * @version v1.0
     */
    public void run() {
      if (CarouselView.this.getChildCount() == 0) {
        endFling(true);
        return;
      }

      mShouldStopFling = false;

      final Rotator rotator;
      final float angle;
      boolean more;
      synchronized (this) {
        rotator = mRotator;
        more = rotator.computeAngleOffset();
        angle = rotator.getCurrAngle();
      }

      // Flip sign to convert finger direction to list items direction
      // (e.g. finger moving down means list is moving towards the top)
      float delta = mLastFlingAngle - angle;

      //////// Shoud be reworked
      trackMotionScroll(delta);

      if (more && !mShouldStopFling) {
        mLastFlingAngle = angle;
        post(this);
      } else {
        mLastFlingAngle = 0.0f;
        endFling(true);
      }
    }
    /**
     * Start using distance.
     *
     * @param deltaAngle the delta angle
     */
    public void startUsingDistance(float deltaAngle) {
      if (deltaAngle == 0) return;

      startCommon();

      mLastFlingAngle = 0;
      synchronized (this) {
        mRotator.startRotate(0.0f, -deltaAngle, mAnimationDuration);
      }
      post(this);
    }
    /**
     * End fling.
     *
     * @param scrollIntoSlots the scroll into slots
     */
    private void endFling(boolean scrollIntoSlots) {
      /*
       * Force the scroller's status to finished (without setting its
       * position to the end)
       */
      synchronized (this) {
        mRotator.forceFinished(true);
      }

      if (scrollIntoSlots) scrollIntoSlots();
    }
    /**
     * Start using velocity.
     *
     * @param initialVelocity the initial velocity
     */
    public void startUsingVelocity(float initialVelocity) {
      if (initialVelocity == 0) return;

      startCommon();

      mLastFlingAngle = 0.0f;

      mRotator.fling(initialVelocity);

      post(this);
    }