コード例 #1
0
  private boolean stepAnimation(long now) {
    if (now > mHalfwayPoint) {
      mHalfwayPoint = Long.MAX_VALUE;
    }
    if (mFinishAnimReady && mFinishAnimStartTime < 0) {
      if (DEBUG_STATE) Slog.v(TAG, "Step: finish anim now ready");
      mFinishAnimStartTime = now;
    }

    if (TWO_PHASE_ANIMATION) {
      mMoreStartExit = false;
      if (mStartExitAnimation != null) {
        mMoreStartExit = mStartExitAnimation.getTransformation(now, mStartExitTransformation);
        if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start exit: " + mStartExitTransformation);
      }

      mMoreStartEnter = false;
      if (mStartEnterAnimation != null) {
        mMoreStartEnter = mStartEnterAnimation.getTransformation(now, mStartEnterTransformation);
        if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start enter: " + mStartEnterTransformation);
      }
    }
    if (USE_CUSTOM_BLACK_FRAME) {
      mMoreStartFrame = false;
      if (mStartFrameAnimation != null) {
        mMoreStartFrame = mStartFrameAnimation.getTransformation(now, mStartFrameTransformation);
        if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start frame: " + mStartFrameTransformation);
      }
    }

    long finishNow = mFinishAnimReady ? (now - mFinishAnimStartTime) : 0;
    if (DEBUG_STATE) Slog.v(TAG, "Step: finishNow=" + finishNow);

    if (TWO_PHASE_ANIMATION) {
      mMoreFinishExit = false;
      if (mFinishExitAnimation != null) {
        mMoreFinishExit =
            mFinishExitAnimation.getTransformation(finishNow, mFinishExitTransformation);
        if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish exit: " + mFinishExitTransformation);
      }

      mMoreFinishEnter = false;
      if (mFinishEnterAnimation != null) {
        mMoreFinishEnter =
            mFinishEnterAnimation.getTransformation(finishNow, mFinishEnterTransformation);
        if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish enter: " + mFinishEnterTransformation);
      }
    }
    if (USE_CUSTOM_BLACK_FRAME) {
      mMoreFinishFrame = false;
      if (mFinishFrameAnimation != null) {
        mMoreFinishFrame =
            mFinishFrameAnimation.getTransformation(finishNow, mFinishFrameTransformation);
        if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish frame: " + mFinishFrameTransformation);
      }
    }

    mMoreRotateExit = false;
    if (mRotateExitAnimation != null) {
      mMoreRotateExit = mRotateExitAnimation.getTransformation(now, mRotateExitTransformation);
      if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate exit: " + mRotateExitTransformation);
    }

    mMoreRotateEnter = false;
    if (mRotateEnterAnimation != null) {
      mMoreRotateEnter = mRotateEnterAnimation.getTransformation(now, mRotateEnterTransformation);
      if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate enter: " + mRotateEnterTransformation);
    }

    if (USE_CUSTOM_BLACK_FRAME) {
      mMoreRotateFrame = false;
      if (mRotateFrameAnimation != null) {
        mMoreRotateFrame = mRotateFrameAnimation.getTransformation(now, mRotateFrameTransformation);
        if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate frame: " + mRotateFrameTransformation);
      }
    }

    if (!mMoreRotateExit && (!TWO_PHASE_ANIMATION || (!mMoreStartExit && !mMoreFinishExit))) {
      if (TWO_PHASE_ANIMATION) {
        if (mStartExitAnimation != null) {
          if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing start exit anim!");
          mStartExitAnimation.cancel();
          mStartExitAnimation = null;
          mStartExitTransformation.clear();
        }
        if (mFinishExitAnimation != null) {
          if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing finish exit anim!");
          mFinishExitAnimation.cancel();
          mFinishExitAnimation = null;
          mFinishExitTransformation.clear();
        }
      }
      if (mRotateExitAnimation != null) {
        if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing rotate exit anim!");
        mRotateExitAnimation.cancel();
        mRotateExitAnimation = null;
        mRotateExitTransformation.clear();
      }
    }

    if (!mMoreRotateEnter && (!TWO_PHASE_ANIMATION || (!mMoreStartEnter && !mMoreFinishEnter))) {
      if (TWO_PHASE_ANIMATION) {
        if (mStartEnterAnimation != null) {
          if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing start enter anim!");
          mStartEnterAnimation.cancel();
          mStartEnterAnimation = null;
          mStartEnterTransformation.clear();
        }
        if (mFinishEnterAnimation != null) {
          if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing finish enter anim!");
          mFinishEnterAnimation.cancel();
          mFinishEnterAnimation = null;
          mFinishEnterTransformation.clear();
        }
      }
      if (mRotateEnterAnimation != null) {
        if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing rotate enter anim!");
        mRotateEnterAnimation.cancel();
        mRotateEnterAnimation = null;
        mRotateEnterTransformation.clear();
      }
    }

    if (USE_CUSTOM_BLACK_FRAME && !mMoreStartFrame && !mMoreRotateFrame && !mMoreFinishFrame) {
      if (mStartFrameAnimation != null) {
        if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing start frame anim!");
        mStartFrameAnimation.cancel();
        mStartFrameAnimation = null;
        mStartFrameTransformation.clear();
      }
      if (mFinishFrameAnimation != null) {
        if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing finish frame anim!");
        mFinishFrameAnimation.cancel();
        mFinishFrameAnimation = null;
        mFinishFrameTransformation.clear();
      }
      if (mRotateFrameAnimation != null) {
        if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing rotate frame anim!");
        mRotateFrameAnimation.cancel();
        mRotateFrameAnimation = null;
        mRotateFrameTransformation.clear();
      }
    }

    mExitTransformation.set(mRotateExitTransformation);
    mEnterTransformation.set(mRotateEnterTransformation);
    if (TWO_PHASE_ANIMATION) {
      mExitTransformation.compose(mStartExitTransformation);
      mExitTransformation.compose(mFinishExitTransformation);

      mEnterTransformation.compose(mStartEnterTransformation);
      mEnterTransformation.compose(mFinishEnterTransformation);
    }

    if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final exit: " + mExitTransformation);
    if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final enter: " + mEnterTransformation);

    if (USE_CUSTOM_BLACK_FRAME) {
      // mFrameTransformation.set(mRotateExitTransformation);
      // mFrameTransformation.compose(mStartExitTransformation);
      // mFrameTransformation.compose(mFinishExitTransformation);
      mFrameTransformation.set(mRotateFrameTransformation);
      mFrameTransformation.compose(mStartFrameTransformation);
      mFrameTransformation.compose(mFinishFrameTransformation);
      mFrameTransformation.getMatrix().preConcat(mFrameInitialMatrix);
      if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final frame: " + mFrameTransformation);
    }

    final boolean more =
        (TWO_PHASE_ANIMATION
                && (mMoreStartEnter || mMoreStartExit || mMoreFinishEnter || mMoreFinishExit))
            || (USE_CUSTOM_BLACK_FRAME && (mMoreStartFrame || mMoreRotateFrame || mMoreFinishFrame))
            || mMoreRotateEnter
            || mMoreRotateExit
            || !mFinishAnimReady;

    mSnapshotFinalMatrix.setConcat(mExitTransformation.getMatrix(), mSnapshotInitialMatrix);

    if (DEBUG_STATE) Slog.v(TAG, "Step: more=" + more);

    return more;
  }