rod*_*ira 17 gwt animation jquery-animate
我正在玩GWT的动画课作为练习.我的目标不是为GWT创建另一个小部件/动画库.另外,我很清楚有很多库可以做到这一点.我要做的是学习如何做到这一点,而不是如何使用一些库.这仅用于教育目的....
话虽如此,我已经实现了一个简单的类,在一些小部件上执行4种不同的动画:淡入,淡出,滑入和滑出(遵循jQuery的动画模型).请参阅下面的代码,了解我是如何实现它的.
现场演示: http ://www.rodrigo-silveira.com/gwt-custom-animation/
我的问题:如果触发另一个动画,我怎样才能顺利[并成功]停止动画,并继续当前动画中旧动画停止的动画?
例如,如果在调用slideOut()时,slideIn()是一半,那么如何从小部件的自然高度50%开始滑出?我尝试保留一个始终跟踪当前进度的成员变量,以便我可以在新动画中使用它,但似乎无法正确使用它.有任何想法吗?
import com.google.gwt.animation.client.Animation;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.Element;
public class RokkoAnim extends Animation {
private Element element;
private int currentOp;
private final static int FADE_OUT = 0;
private final static int FADE_IN = 1;
private final static int SLIDE_IN = 2;
private final static int SLIDE_OUT = 3;
public RokkoAnim(Element element) {
this.element = element;
}
public void fadeOut(int durationMilli) {
cancel();
currentOp = RokkoAnim.FADE_OUT;
run(durationMilli);
}
public void fadeIn(int durationMilli) {
cancel();
currentOp = RokkoAnim.FADE_IN;
run(durationMilli);
}
public void slideIn(int durationMilli) {
cancel();
currentOp = RokkoAnim.SLIDE_IN;
run(durationMilli);
}
public void slideOut(int durationMilli) {
cancel();
currentOp = RokkoAnim.SLIDE_OUT;
run(durationMilli);
}
@Override
protected void onUpdate(double progress) {
switch (currentOp) {
case RokkoAnim.FADE_IN:
doFadeIn(progress);
break;
case RokkoAnim.FADE_OUT:
doFadeOut(progress);
break;
case RokkoAnim.SLIDE_IN:
doSlideIn(progress);
break;
case RokkoAnim.SLIDE_OUT:
doSlideOut(progress);
break;
}
}
private void doFadeOut(double progress) {
element.getStyle().setOpacity(1.0d - progress);
}
private void doFadeIn(double progress) {
element.getStyle().setOpacity(progress);
}
private void doSlideIn(double progress) {
double height = element.getScrollHeight();
element.getStyle().setHeight(height * (1.0d - progress), Unit.PX);
}
private void doSlideOut(double progress) {
// Hard coded value. How can I find out what
// the element's max natural height is if it's
// currently set to height: 0 ?
element.getStyle().setHeight(200 * progress, Unit.PX);
}
}
Run Code Online (Sandbox Code Playgroud)
用法
// 1. Get some widget
FlowPanel div = new FlowPanel();
// 2. Instantiate the animation, passing the widget
RokkoAnim anim = new RokkoAnim(div.getElement());
// 3. Perform the animation
// >> inside mouseover event of some widget:
anim.fadeIn(1500);
// >> inside mouseout event of some widget:
anim.fadeOut(1500);
Run Code Online (Sandbox Code Playgroud)
小智 8
您需要根据当前值(相当于+=或-=赋值)更新不透明度:
private void doFadeOut(double progress) {
double opacity = element.getStyle().getOpacity();
element.getStyle().setOpacity(opacity - 1.0d - progress);
}
private void doFadeIn(double progress) {
double opacity = element.getStyle().getOpacity();
element.getStyle().setOpacity(opacity + progress);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6899 次 |
| 最近记录: |