gwt - GWT 中类似 jQuery 的平滑动画

标签 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);
    }
}

使用

// 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);

最佳答案

您需要根据当前值更新不透明度(相当于+=-= 赋值):

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);
}

关于gwt - GWT 中类似 jQuery 的平滑动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14250659/

相关文章:

javascript - 如何使用 Kinetic js/html5 为弧形设置动画,以便 "snake"变长?

jquery - 帮助自定义 jquery 缓动函数

jQuery - 我可以为 addClass/removeClass 设置动画吗

java - GWT 延迟绑定(bind)和依赖注入(inject)

java - 从java项目中提取所有字符串

gwt - 使用 AsyncDataProvider 进行列排序 - 如何找出用户想要排序的列?

html - 摆脱 <canvas> 元素周围的填充/边距?

安卓车速表(针规)

ios - 如何使用自动布局对 View 进行动画更改 View 层次结构?

jQuery折叠褪色div和展开动画问题