com.google.gwt.animation.client.AnimationScheduler Maven / Gradle / Ivy
/*
* Copyright 2011 Google Inc.
*
* 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 com.google.gwt.animation.client;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Element;
/**
* This class provides task scheduling for animations. Any exceptions thrown by
* the command objects executed by the scheduler will be passed to the
* {@link com.google.gwt.core.client.GWT.UncaughtExceptionHandler} if one is
* installed.
*/
public abstract class AnimationScheduler {
/**
* Helper to detect native support for animations.
*
* Note: This class solely exists to provide opportunity for mocking frameworks to intercept
* the native call.
*/
public static class AnimationSupportDetector {
public native boolean isNativelySupported() /*-{
return !!$wnd.requestAnimationFrame && !!$wnd.cancelAnimationFrame;
}-*/;
}
/**
* The callback used when an animation frame becomes available.
*/
public interface AnimationCallback {
/**
* Invokes the command.
*
* @param timestamp the current timestamp
*/
void execute(double timestamp);
}
/**
* A handle to the requested animation frame created by
* {@link #requestAnimationFrame(AnimationCallback, Element)}.
*/
public abstract static class AnimationHandle {
/**
* Cancel the requested animation frame. If the animation frame is already
* canceled, do nothing.
*/
public abstract void cancel();
}
private static AnimationScheduler instance;
/**
* Returns the default implementation of the AnimationScheduler API.
*/
public static AnimationScheduler get() {
if (instance == null) {
AnimationSupportDetector supportDetector = GWT.create(AnimationSupportDetector.class);
instance = (supportDetector != null && supportDetector.isNativelySupported())
? new AnimationSchedulerImplStandard() : new AnimationSchedulerImplTimer();
}
return instance;
}
/**
* Schedule an animation, letting the browser decide when to trigger the next
* step in the animation.
*
*
* NOTE: If you are animating an element, use
* {@link #requestAnimationFrame(AnimationCallback, Element)} instead so the
* browser can optimize for the specified element.
*
*
*
* Using this method instead of a timeout is preferred because the browser is
* in the best position to decide how frequently to trigger the callback for
* an animation of the specified element. The browser can balance multiple
* animations and trigger callbacks at the optimal rate for smooth
* performance.
*
*
* @param callback the callback to fire
* @return a handle to the requested animation frame
* @see #requestAnimationFrame(AnimationCallback, Element)
*/
public AnimationHandle requestAnimationFrame(AnimationCallback callback) {
return requestAnimationFrame(callback, null);
}
/**
* Schedule an animation, letting the browser decide when to trigger the next
* step in the animation.
*
*
* Using this method instead of a timeout is preferred because the browser is
* in the best position to decide how frequently to trigger the callback for
* an animation of the specified element. The browser can balance multiple
* animations and trigger callbacks at the optimal rate for smooth
* performance.
*
*
* @param callback the callback to fire
* @return a handle to the requested animation frame
* @param element the element being animated
*/
public abstract AnimationHandle requestAnimationFrame(AnimationCallback callback, Element element);
}