Skip to content

Commit 06c2459

Browse files
committed
Fix MaterialAnimation timer issues, objectify animation class.
1 parent 0be5d3a commit 06c2459

File tree

2 files changed

+126
-81
lines changed

2 files changed

+126
-81
lines changed

gwt-material/src/main/java/gwt/material/design/client/ui/animate/MaterialAnimation.java

Lines changed: 117 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,16 @@
1919
*/
2020
package gwt.material.design.client.ui.animate;
2121

22+
import com.google.gwt.user.client.Timer;
2223
import com.google.gwt.user.client.ui.Widget;
24+
import gwt.material.design.client.constants.CssName;
25+
import gwt.material.design.client.js.JsMaterialElement;
26+
import gwt.material.design.client.ui.html.ListItem;
27+
import gwt.material.design.client.ui.html.UnorderedList;
2328
import gwt.material.design.jquery.client.api.Functions;
2429

30+
import static gwt.material.design.client.js.JsMaterialElement.$;
31+
2532
/**
2633
* Stateful object holding animation details.
2734
* Default behaviour is a bounce transition for 800ms.
@@ -34,9 +41,15 @@ public class MaterialAnimation {
3441
private int durationMillis = 800;
3542
private boolean infinite;
3643

44+
private Timer startTimer, endTimer;
45+
3746
public MaterialAnimation() {
3847
}
3948

49+
public MaterialAnimation(Widget widget) {
50+
this.widget = widget;
51+
}
52+
4053
public MaterialAnimation transition(Transition transition) {
4154
this.transition = transition;
4255
return this;
@@ -58,14 +71,115 @@ public MaterialAnimation infinite(boolean infinite) {
5871
return this;
5972
}
6073

74+
public void animate() {
75+
animate(widget);
76+
}
77+
6178
public void animate(Widget widget) {
62-
this.widget = widget;
6379
animate(widget, null);
6480
}
6581

82+
public void animate(Functions.Func callback) {
83+
animate(widget, callback);
84+
}
85+
6686
public void animate(Widget widget, Functions.Func callback) {
67-
this.widget = widget;
68-
MaterialAnimator.animate(transition, widget, delayMillis, durationMillis, callback, infinite);
87+
if(widget != null) {
88+
this.widget = widget;
89+
} else {
90+
throw new NullPointerException("Cannot animate on a null widget.");
91+
}
92+
93+
if(startTimer != null) {
94+
// Exit early since we are already animating.
95+
return;
96+
}
97+
98+
final JsMaterialElement element = $(widget.getElement());
99+
100+
element.css("animation-duration", durationMillis + "ms");
101+
element.css("-webkit-animation-duration", durationMillis + "ms");
102+
103+
switch (transition) {
104+
case SHOW_STAGGERED_LIST:
105+
if (widget instanceof UnorderedList) {
106+
UnorderedList ul = (UnorderedList) widget;
107+
108+
for (Widget li : ul) {
109+
if (li instanceof ListItem) {
110+
li.getElement().getStyle().setOpacity(0);
111+
}
112+
}
113+
}
114+
break;
115+
case SHOW_GRID:
116+
widget.getElement().getStyle().setOpacity(0);
117+
break;
118+
default:
119+
break;
120+
}
121+
122+
startTimer = new Timer() {
123+
@Override
124+
public void run() {
125+
switch (transition) {
126+
case SHOW_STAGGERED_LIST:
127+
JsMaterialElement.showStaggeredList(element);
128+
break;
129+
case FADE_IN_IMAGE:
130+
JsMaterialElement.fadeInImage(element);
131+
break;
132+
case SHOW_GRID:
133+
widget.addStyleName(CssName.DISPLAY_ANIMATION);
134+
JsMaterialElement.closeGrid(element);
135+
break;
136+
case CLOSE_GRID:
137+
widget.addStyleName(CssName.DISPLAY_ANIMATION);
138+
JsMaterialElement.closeGrid(element);
139+
break;
140+
default:
141+
// For core animation components
142+
if (infinite) {
143+
widget.addStyleName(CssName.INFINITE);
144+
}
145+
widget.addStyleName("animated " + transition.getCssName());
146+
147+
// Only start the end timer if its not already active.
148+
if(endTimer == null) {
149+
endTimer = new Timer() {
150+
@Override
151+
public void run() {
152+
if (callback != null) {
153+
callback.call();
154+
}
155+
if (!infinite) {
156+
$(element).removeClass("animated " + transition.getCssName());
157+
}
158+
159+
endTimer = null;
160+
startTimer = null;
161+
}
162+
};
163+
endTimer.schedule(durationMillis);
164+
}
165+
break;
166+
}
167+
}
168+
};
169+
startTimer.schedule(delayMillis);
170+
171+
widget.removeStyleName(CssName.MATERIALIZE_CSS);
172+
}
173+
174+
/**
175+
* Stop an animation.
176+
*/
177+
public void stopAnimation() {
178+
if(widget != null) {
179+
widget.removeStyleName("animated");
180+
widget.removeStyleName(transition.getCssName());
181+
widget.removeStyleName(CssName.INFINITE);
182+
}
69183
}
70184

71185
public Widget getWidget() {

gwt-material/src/main/java/gwt/material/design/client/ui/animate/MaterialAnimator.java

Lines changed: 9 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,16 @@
2020
* #L%
2121
*/
2222

23-
import com.google.gwt.dom.client.Element;
24-
import com.google.gwt.user.client.Timer;
2523
import com.google.gwt.user.client.ui.Widget;
26-
import gwt.material.design.client.constants.CssName;
27-
import gwt.material.design.client.js.JsMaterialElement;
28-
import gwt.material.design.client.ui.html.ListItem;
29-
import gwt.material.design.client.ui.html.UnorderedList;
3024
import gwt.material.design.jquery.client.api.Functions;
3125

32-
import static gwt.material.design.client.js.JsMaterialElement.$;
33-
3426
/**
35-
* Provides core and meaningful animation
27+
* Provides core and meaningful animation.
3628
*
29+
* @deprecated use {@link MaterialAnimation}.
3730
* @author kevzlou7979
3831
*/
32+
@Deprecated
3933
public class MaterialAnimator {
4034

4135
public static void animate(final Transition transition, final Widget w, int delayMillis, Functions.Func callback) {
@@ -54,80 +48,17 @@ public static void animate(final Transition transition, final Widget w, int dela
5448
animate(transition, w, delayMillis, 800, null, false);
5549
}
5650

57-
public static void stopAnimation(Widget w) {
58-
w.removeStyleName(CssName.INFINITE);
59-
}
60-
6151
public static void animate(final Transition transition,
6252
final Widget w,
6353
int delayMillis,
6454
final int durationMillis,
6555
final Functions.Func callback,
6656
final boolean infinite) {
67-
final JsMaterialElement element = $(w.getElement());
68-
69-
element.css("animation-duration", durationMillis + "ms");
70-
element.css("-webkit-animation-duration", durationMillis + "ms");
71-
72-
switch (transition) {
73-
case SHOW_STAGGERED_LIST:
74-
if (w instanceof UnorderedList) {
75-
UnorderedList ul = (UnorderedList) w;
76-
77-
for (Widget li : ul) {
78-
if (li instanceof ListItem) {
79-
li.getElement().getStyle().setOpacity(0);
80-
}
81-
}
82-
}
83-
break;
84-
case SHOW_GRID:
85-
w.getElement().getStyle().setOpacity(0);
86-
break;
87-
default:
88-
break;
89-
}
90-
91-
new Timer() {
92-
@Override
93-
public void run() {
94-
switch (transition) {
95-
case SHOW_STAGGERED_LIST:
96-
JsMaterialElement.showStaggeredList(element);
97-
break;
98-
case FADE_IN_IMAGE:
99-
JsMaterialElement.fadeInImage(element);
100-
break;
101-
case SHOW_GRID:
102-
w.addStyleName(CssName.DISPLAY_ANIMATION);
103-
JsMaterialElement.closeGrid(element);
104-
break;
105-
case CLOSE_GRID:
106-
w.addStyleName(CssName.DISPLAY_ANIMATION);
107-
JsMaterialElement.closeGrid(element);
108-
break;
109-
default:
110-
// For core animation components
111-
if (infinite) {
112-
w.addStyleName(CssName.INFINITE);
113-
}
114-
w.addStyleName("animated " + transition.getCssName());
115-
new Timer() {
116-
@Override
117-
public void run() {
118-
if (callback != null) {
119-
callback.call();
120-
}
121-
if (!infinite) {
122-
$(element).removeClass(transition.getCssName());
123-
}
124-
}
125-
}.schedule(durationMillis);
126-
break;
127-
}
128-
}
129-
}.schedule(delayMillis);
130-
131-
w.removeStyleName(CssName.MATERIALIZE_CSS);
57+
new MaterialAnimation()
58+
.transition(transition)
59+
.delayMillis(delayMillis)
60+
.durationMillis(durationMillis)
61+
.infinite(infinite)
62+
.animate(w, callback);
13263
}
13364
}

0 commit comments

Comments
 (0)