当前位置 : 主页 > 网络编程 > JavaScript >

GoJs中的动画使用示例详解

来源:互联网 收集:自由互联 发布时间:2023-05-14
目录 前言 GoJs动画的使用 使用默认的动画 通过AnimationTrigger修改属性动画 删除节点的动画 提示性的回弹动画 总结 前言 在可视化图形的使用过程中,在图形初次渲染的时候、增加节点
目录
  • 前言
  • GoJs动画的使用
    • 使用默认的动画
    • 通过AnimationTrigger修改属性动画
    • 删除节点的动画
    • 提示性的回弹动画
  • 总结

    前言

    在可视化图形的使用过程中,在图形初次渲染的时候、增加节点、删除节点等操作的时候。如果没有一个动画过程,就会把整个过程变得有一闪而过,影响用户的体验,也影响用户对操作是否成功的判断。

    GoJs动画的使用

    gojs中支持默认的动画和自定义的动画两种,使用默认的动画的时候只需要给DiagramAnimationManager属性修改就行。或者通过Animation或者AnimationTrigger来创建自定义动画。

    使用默认的动画

    默认的动画包括DefaultAnimateLocations两种,其使用方法如下

    //data
    nodes:[
    { key: "1", color: "#99FFFF",text:"三国",figure:"Rectangle" },
    { key: "1-1", color: "#FF0000",text:"魏",figure:"Circle" },
    { key: "1-2", color: "#FFFF66",text:"蜀",figure:"Circle"},
    { key: "1-3", color: "#0000FF",text:"吴",figure:"Circle" },
    ],
    links:[
    {
      from:"1",
      to:"1-1"
    },
    {
      from:"1",
      to:"1-2"
    },
    {
      from:"1",
      to:"1-3"
    },
    ]
    //methods
    Default(){
        this.myDiagram.animationManager.initialAnimationStyle = go.AnimationManager.Default;
        this.myDiagram.model = go.Model.fromJSON(this.myDiagram.model.toJSON());
    },
    AnimateLocations(){
        this.myDiagram.animationManager.initialAnimationStyle = go.AnimationManager.AnimateLocations;
        this.myDiagram.model = go.Model.fromJSON(this.myDiagram.model.toJSON());
    },
    

    默认动画只需要修改animationManager.initialAnimationStyle属性就可以实现

    通过AnimationTrigger修改属性动画

    this.myDiagram.nodeTemplate =
        $$(go.Node, "Vertical",
        { selectionAdorned: false,selectionChanged: this.onSelectionChanged }, 
        $$(go.Shape, "Circle",
            { width: 30, height: 30,name:"ICON" },
            new go.AnimationTrigger('stroke'),
            new go.AnimationTrigger('fill'),
            new go.Binding("figure", "figure"),
          ),
        $$(go.TextBlock, 
            new go.Binding("text", "text")),
       );
       this.myDiagram.model = new go.GraphLinksModel(this.nodes, this.links);
    },
    animateTrigger(){
        this.myDiagram.commit(function(diag) {
            diag.nodes.each(function(node){
                node.elt(0).stroke = go.Brush.randomColor();
                node.elt(0).fill = go.Brush.randomColor();
            })
        });
    }

    如果给节点的绘图属性进行修改的过程中添加动画的话,则需要在属性的配置下面通过new go.AnimationTrigger来配置需要添加动画的属性值,然后在按钮的点击事件绑定的函数animateTrigger中,在函数中对添加了动画的属性进行一个修改操作就可以了。

    删除节点的动画

    在节点的删除过程中可以添加一个动画,但是节点删除之后画布中就不存在节点了。因此在删除的时候需要拷贝一下节点的信息,对拷贝的节点对象通过Animation.add进行动画处理。在下面的示例中,我们利用前面的选中节点的删除的监听方法SelectionDeleting进行操作。

    this.myDiagram.addDiagramListener('SelectionDeleting', function(e) {
        e.subject.each(function(part) {
            if (!(part instanceof go.Node)) return;
            let animation = new go.Animation();
            let deletePart = part.copy();
            animation.add(deletePart, "scale", deletePart.scale, 0.01);
            animation.add(deletePart, "angle", deletePart.angle, 360);
            animation.addTemporaryPart(deletePart, myDiagram);
            animation.start();
        });
    });
    

    提示性的回弹动画

    在很多场景中需要对操作过程有一个反馈,因此提供了一些提示性的回弹动画,比如缩小之后恢复原样,放大之后恢复原样的过程。代码示例如下

    //Html
    <button @click="angle">angle</button>
    <button @click="position">position</button>
    <button @click="zoomOut">zoomOut</button>
    <button @click="zoomIn">zoomIn</button>
    //methods
    angle(){
        this.myDiagram.animationManager.stopAnimation(true);
        let animation = new go.Animation();
        this.myDiagram.nodes.each(function(node) {
            animation.add(node, "angle", node.angle, Math.random() * 90);
        });
        animation.start(); 
    },
    position(){
            this.myDiagram.animationManager.stopAnimation(true);
            let animation = new go.Animation();
            animation.reversible = true; 
            animation.add(this.myDiagram, "position", this.myDiagram.position, this.myDiagram.position.copy().offset(200, 15));
            animation.duration = 700;
            animation.start(); 
    },
    zoomOut(){
            this.myDiagram.animationManager.stopAnimation(true);
            let animation = new go.Animation();
            animation.reversible = true; 
            animation.add(this.myDiagram, "scale", this.myDiagram.scale, 0.2);
            animation.start(); 
    },
    zoomIn(){
            this.myDiagram.animationManager.stopAnimation(true);
            let animation = new go.Animation();
            animation.reversible = true; 
            animation.add(this.myDiagram, "scale", this.myDiagram.scale, 4);
            animation.start(); 
    }

    通过创建动画实例,然后通过animation.add方法可以实现对angle、position、scale的动画操作。 这里需要注意的是,在每次动画的函数开始必须通过animationManager.stopAnimation方法来停止动画,否则的话,动画会在上一个动画的中间时刻就运行下一个动画,会造成图形变形,下面zoomOut方法为例。

    总结

    本文主要介绍了gojs内部已经封装的一些动画的配置和使用方法,有了动画的引入,不仅仅可以让操作过程变得很丝滑,很好的提高的用户的体验。并且让比如删除节点这种没有感觉的操作增加删除的观感。后面会对动画的自定义方法进行一个介绍。

    以上就是GoJs中的动画使用示例详解的详细内容,更多关于GoJs动画使用的资料请关注自由互联其它相关文章!

    网友评论