Search code examples
domgwtdom-eventscss-animationsgwt-2.4

How to add CSS AnimationEnd event handler to GWT widget?


I would like my GWT widget to be notified when its CSS animation is over.

In plain HTML/Javascript this is easily done by registering an event handler like so:

elem.addEventListener("webkitAnimationEnd", function(){
    // do something
}, false);
// add more for Mozilla etc.

How can I do this in GWT?

This type of event is unknown to GWT's DOMImpl classes, so I keep getting an error:

"Trying to sink unknown event type webkitAnimationEnd".


Solution

  • You can always write some of the native (JavaScript) code yourself:

    public class CssAnimation {
      public static native void registerCssCallback(
          Element elem, AsyncCallback<Void> callback) /*-{
        elem.addEventListener("webkitAnimationEnd", function() {
          $entry(@CssAnimation::cssCallback(Lcom/google/gwt/user/client/rpc/AsyncCallback;)(callback));
        }, false);
      }-*/;
    
    
      protected static void cssCallback(AsyncCallback<Void> callback) {
        callback.onSuccess(null);
      }
    }
    

    I haven't tried the code above. Let me know if it works as expected.


    You can use GWT's Animation class to achieve the same effect. For example,

      new com.google.gwt.animation.client.Animation() {
        final com.google.gwt.dom.client.Style es = widget.getElement().getStyle();
    
        @Override
        protected void onUpdate(double progress) {
          setOpacity(1 - interpolate(progress));
        }
    
        private void setOpacity(double opacity) {
          es.setProperty("opacity", Double.toString(opacity));
          es.setProperty("filter", "alpha(opacity=" + 100 * opacity + ")");
        }
    
        @Override
        protected void onComplete() {
          /* ... run some code when animation completes ... */
        }
      }.run(2000, 5000);