/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.animation; import android.view.animation.AnimationUtils; /** * This class provides a simple callback mechanism to listeners that is synchronized with all * other animators in the system. There is no duration, interpolation, or object value-setting * with this Animator. Instead, it is simply started, after which it proceeds to send out events * on every animation frame to its TimeListener (if set), with information about this animator, * the total elapsed time, and the elapsed time since the previous animation frame. */ public class TimeAnimator extends ValueAnimator { private TimeListener mListener; private long mPreviousTime = -1; @Override public void start() { mPreviousTime = -1; super.start(); } @Override boolean animateBasedOnTime(long currentTime) { if (mListener != null) { long totalTime = currentTime - mStartTime; long deltaTime = (mPreviousTime < 0) ? 0 : (currentTime - mPreviousTime); mPreviousTime = currentTime; mListener.onTimeUpdate(this, totalTime, deltaTime); } return false; } @Override public void setCurrentPlayTime(long playTime) { long currentTime = AnimationUtils.currentAnimationTimeMillis(); mStartTime = Math.max(mStartTime, currentTime - playTime); mStartTimeCommitted = true; // do not allow start time to be compensated for jank animateBasedOnTime(currentTime); } /** * Sets a listener that is sent update events throughout the life of * an animation. * * @param listener the listener to be set. */ public void setTimeListener(TimeListener listener) { mListener = listener; } @Override void animateValue(float fraction) { // Noop } @Override void initAnimation() { // noop } /** * Implementors of this interface can set themselves as update listeners * to a TimeAnimator instance to receive callbacks on every animation * frame to receive the total time since the animator started and the delta time * since the last frame. The first time the listener is called, * deltaTime will be zero. The same is true for totalTime, unless the animator was * set to a specific {@link ValueAnimator#setCurrentPlayTime(long) currentPlayTime} * prior to starting. */ public static interface TimeListener { /** *

Notifies listeners of the occurrence of another frame of the animation, * along with information about the elapsed time.

* * @param animation The animator sending out the notification. * @param totalTime The total time elapsed since the animator started, in milliseconds. * @param deltaTime The time elapsed since the previous frame, in milliseconds. */ void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime); } }