Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d7b50b8 authored by Chet Haase's avatar Chet Haase
Browse files

Add new API to Animator to allow seeking of animations

Change-Id: I3960030f54814ed0ef6fb6853061c64ab3b4dd1c
parent 208c425e
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -19914,6 +19914,17 @@
 visibility="public"
>
</method>
<method name="getCurrentPlayTime"
 return="long"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="getFrameDelay"
 return="long"
 abstract="false"
@@ -19993,6 +20004,19 @@
<parameter name="listener" type="android.animation.Animator.AnimatorUpdateListener">
</parameter>
</method>
<method name="setCurrentPlayTime"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="playTime" type="long">
</parameter>
</method>
<method name="setEvaluator"
 return="void"
 abstract="false"
+60 −1
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ public class Animator extends Animatable {
    private static final int RUNNING    = 1; // Playing normally
    private static final int CANCELED   = 2; // cancel() called - need to end it
    private static final int ENDED      = 3; // end() called - need to end it
    private static final int SEEKED     = 4; // Seeked to some time value

    /**
     * Enum values used in XML attributes to indicate the value for mValueType
@@ -85,6 +86,12 @@ public class Animator extends Animatable {
    // to animateFrame()
    private long mStartTime;

    /**
     * Set when setCurrentPlayTime() is called. If negative, animation is not currently seeked
     * to a value.
     */
    private long mSeekTime = -1;

    // The static sAnimationHandler processes the internal timing loop on which all animations
    // are based
    private static AnimationHandler sAnimationHandler;
@@ -144,6 +151,12 @@ public class Animator extends Animatable {
    private static final ArrayList<Animator> sDelayedAnims = new ArrayList<Animator>();
    private static final ArrayList<Animator> sReadyAnims = new ArrayList<Animator>();

    /**
     * Flag that denotes whether the animation is set up and ready to go. Used by seek() to
     * set up animation that has not yet been started.
     */
    private boolean mInitialized = false;

    //
    // Backing variables
    //
@@ -411,6 +424,44 @@ public class Animator extends Animatable {
        }
        mPlayingBackwards = false;
        mCurrentIteration = 0;
        mInitialized = true;
    }

    /**
     * Sets the position of the animation to the specified point in time. This time should
     * be between 0 and the total duration of the animation, including any repetition. If
     * the animation has not yet been started, then it will not advance forward after it is
     * set to this time; it will simply set the time to this value and perform any appropriate
     * actions based on that time. If the animation is already running, then seek() will
     * set the current playing time to this value and continue playing from that point.
     *
     * @param playTime The time, in milliseconds, to which the animation is advanced or rewound.
     */
    public void setCurrentPlayTime(long playTime) {
        if (!mInitialized) {
            initAnimation();
        }
        long currentTime = AnimationUtils.currentAnimationTimeMillis();
        if (mPlayingState != RUNNING) {
            mSeekTime = playTime;
            mPlayingState = SEEKED;
        }
        mStartTime = currentTime - playTime;
        animationFrame(currentTime);
    }

    /**
     * Gets the current position of the animation in time, which is equal to the current
     * time minus the time that the animation started. An animation that is not yet started will
     * return a value of zero.
     *
     * @return The current position in time of the animation.
     */
    public long getCurrentPlayTime() {
        if (!mInitialized) {
            return 0;
        }
        return AnimationUtils.currentAnimationTimeMillis() - mStartTime;
    }

    /**
@@ -740,6 +791,7 @@ public class Animator extends Animatable {
    }

    public void start() {
        mPlayingState = STOPPED;
        sPendingAnimations.add(this);
        if (sAnimationHandler == null) {
            sAnimationHandler = new AnimationHandler();
@@ -845,10 +897,17 @@ public class Animator extends Animatable {

        if (mPlayingState == STOPPED) {
            mPlayingState = RUNNING;
            if (mSeekTime < 0) {
                mStartTime = currentTime;
            } else {
                mStartTime = currentTime - mSeekTime;
                // Now that we're playing, reset the seek time
                mSeekTime = -1;
            }
        }
        switch (mPlayingState) {
        case RUNNING:
        case SEEKED:
            float fraction = (float)(currentTime - mStartTime) / mDuration;
            if (fraction >= 1f) {
                if (mCurrentIteration < mRepeatCount || mRepeatCount == INFINITE) {