GoJs中的动画使用示例详解

 更新时间:2023年05月05日 10:24:16   作者:沅芷湘兰  
这篇文章主要为大家介绍了GoJs中的动画使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

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

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动画使用的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript返回网页中超链接数量的方法

    JavaScript返回网页中超链接数量的方法

    这篇文章主要介绍了JavaScript返回网页中超链接数量的方法,使用javascript中的document.links实现这一功能,需要的朋友可以参考下
    2015-04-04
  • ie与ff下的event事件使用介绍

    ie与ff下的event事件使用介绍

    event是ie自带的一个对象,而ff中不存在该对象,只能通过传递参数的方式来模拟event,下面简单为大家介绍下
    2013-11-11
  • JavaScript实现垂直向上无缝滚动特效代码

    JavaScript实现垂直向上无缝滚动特效代码

    下面小编就为大家带来一篇JavaScript实现垂直向上无缝滚动特效代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 如何使用JS获取IE上传文件路径(IE7,8)

    如何使用JS获取IE上传文件路径(IE7,8)

    本篇文章是对使用JS获取IE上传文件路径的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • javascript实现框架高度随内容改变的方法

    javascript实现框架高度随内容改变的方法

    这篇文章主要介绍了javascript实现框架高度随内容改变的方法,实例分析了通过父页面及内容改变框架高度两种实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 快速排序 php与javascript的不同之处

    快速排序 php与javascript的不同之处

    告诉你一个排序算法,也许是最重要的是他们知道 - 快速排序,无论是在PHP和JavaScript实现的。虽然这两种语言之间的代码看起来相似,也有一些差异,这表明了语法知识的重要性!
    2011-02-02
  • js调用刷新界面的几种方式

    js调用刷新界面的几种方式

    这篇文章主要为大家详细介绍了js调用刷新界面的几种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 微信小程序实现锚点功能

    微信小程序实现锚点功能

    这篇文章主要为大家详细介绍了微信小程序实现锚点功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 详细讲解js实现电梯导航的实例

    详细讲解js实现电梯导航的实例

    对于某一个页面内容繁多,如果我们滚动的时间较长,为了增加用户体验,我们需要实现点击某一个按钮,然后滚动到对应的区域,滚动的时候,右侧对应的分类实现高亮,所以本文给大家详细介绍讲解了js实现电梯导航,需要的朋友可以参考下
    2023-10-10
  • echarts报错:Error in mounted hook的解决方法

    echarts报错:Error in mounted hook的解决方法

    最近又遇到了写echarts的时候常遇到的一个错误,这篇文章主要给大家介绍了关于echarts报错:Error in mounted hook: “TypeError: Cannot read properties of undefined (reading ‘init‘)“的解决方法,需要的朋友可以参考下
    2022-07-07

最新评论