Loading core/java/android/animation/ValueAnimator.java +1 −1 Original line number Diff line number Diff line Loading @@ -910,7 +910,7 @@ public class ValueAnimator extends Animator { animationHandler.mPendingAnimations.add(this); if (mStartDelay == 0) { // This sets the initial value of the animation, prior to actually starting it running setCurrentPlayTime(getCurrentPlayTime()); setCurrentPlayTime(0); mPlayingState = STOPPED; mRunning = true; notifyStartListeners(); Loading core/java/android/view/Choreographer.java +28 −5 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ public final class Choreographer { private boolean mFrameScheduled; private boolean mCallbacksRunning; private long mLastFrameTimeNanos; private long mFrameIntervalNanos; /** * Callback type: Input callback. Runs first. Loading @@ -116,6 +117,8 @@ public final class Choreographer { mHandler = new FrameHandler(looper); mDisplayEventReceiver = USE_VSYNC ? new FrameDisplayEventReceiver(looper) : null; mLastFrameTimeNanos = Long.MIN_VALUE; mFrameIntervalNanos = (long)(1000000000 / new Display(Display.DEFAULT_DISPLAY, null).getRefreshRate()); mCallbackQueues = new CallbackQueue[CALLBACK_LAST + 1]; for (int i = 0; i <= CALLBACK_LAST; i++) { Loading Loading @@ -343,17 +346,37 @@ public final class Choreographer { } void doFrame(long timestampNanos, int frame) { final long startNanos; synchronized (mLock) { if (!mFrameScheduled) { return; // no work to do } mFrameScheduled = false; mLastFrameTimeNanos = timestampNanos; startNanos = System.nanoTime(); final long jitterNanos = startNanos - timestampNanos; if (jitterNanos >= mFrameIntervalNanos) { final long lastFrameOffset = jitterNanos % mFrameIntervalNanos; if (DEBUG) { Log.d(TAG, "Missed vsync by " + (jitterNanos * 0.000001f) + " ms " + "which is more than the frame interval of " + (mFrameIntervalNanos * 0.000001f) + " ms! " + "Setting frame time to " + (lastFrameOffset * 0.000001f) + " ms in the past."); } timestampNanos = startNanos - lastFrameOffset; } final long startNanos; if (timestampNanos < mLastFrameTimeNanos) { if (DEBUG) { startNanos = System.nanoTime(); Log.d(TAG, "Frame time appears to be going backwards. May be due to a " + "previously skipped frame. Waiting for next vsync"); } scheduleVsyncLocked(); return; } mFrameScheduled = false; mLastFrameTimeNanos = timestampNanos; } doCallbacks(Choreographer.CALLBACK_INPUT); Loading Loading
core/java/android/animation/ValueAnimator.java +1 −1 Original line number Diff line number Diff line Loading @@ -910,7 +910,7 @@ public class ValueAnimator extends Animator { animationHandler.mPendingAnimations.add(this); if (mStartDelay == 0) { // This sets the initial value of the animation, prior to actually starting it running setCurrentPlayTime(getCurrentPlayTime()); setCurrentPlayTime(0); mPlayingState = STOPPED; mRunning = true; notifyStartListeners(); Loading
core/java/android/view/Choreographer.java +28 −5 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ public final class Choreographer { private boolean mFrameScheduled; private boolean mCallbacksRunning; private long mLastFrameTimeNanos; private long mFrameIntervalNanos; /** * Callback type: Input callback. Runs first. Loading @@ -116,6 +117,8 @@ public final class Choreographer { mHandler = new FrameHandler(looper); mDisplayEventReceiver = USE_VSYNC ? new FrameDisplayEventReceiver(looper) : null; mLastFrameTimeNanos = Long.MIN_VALUE; mFrameIntervalNanos = (long)(1000000000 / new Display(Display.DEFAULT_DISPLAY, null).getRefreshRate()); mCallbackQueues = new CallbackQueue[CALLBACK_LAST + 1]; for (int i = 0; i <= CALLBACK_LAST; i++) { Loading Loading @@ -343,17 +346,37 @@ public final class Choreographer { } void doFrame(long timestampNanos, int frame) { final long startNanos; synchronized (mLock) { if (!mFrameScheduled) { return; // no work to do } mFrameScheduled = false; mLastFrameTimeNanos = timestampNanos; startNanos = System.nanoTime(); final long jitterNanos = startNanos - timestampNanos; if (jitterNanos >= mFrameIntervalNanos) { final long lastFrameOffset = jitterNanos % mFrameIntervalNanos; if (DEBUG) { Log.d(TAG, "Missed vsync by " + (jitterNanos * 0.000001f) + " ms " + "which is more than the frame interval of " + (mFrameIntervalNanos * 0.000001f) + " ms! " + "Setting frame time to " + (lastFrameOffset * 0.000001f) + " ms in the past."); } timestampNanos = startNanos - lastFrameOffset; } final long startNanos; if (timestampNanos < mLastFrameTimeNanos) { if (DEBUG) { startNanos = System.nanoTime(); Log.d(TAG, "Frame time appears to be going backwards. May be due to a " + "previously skipped frame. Waiting for next vsync"); } scheduleVsyncLocked(); return; } mFrameScheduled = false; mLastFrameTimeNanos = timestampNanos; } doCallbacks(Choreographer.CALLBACK_INPUT); Loading