GoJs中的動畫使用示例詳解
前言
在可視化圖形的使用過程中,在圖形初次渲染的時候、增加節(jié)點、刪除節(jié)點等操作的時候。如果沒有一個動畫過程,就會把整個過程變得有一閃而過,影響用戶的體驗,也影響用戶對操作是否成功的判斷。
GoJs動畫的使用
在gojs中支持默認(rèn)的動畫和自定義的動畫兩種,使用默認(rèn)的動畫的時候只需要給Diagram的AnimationManager屬性修改就行。或者通過Animation或者AnimationTrigger來創(chuàng)建自定義動畫。
使用默認(rèn)的動畫
默認(rèn)的動畫包括Default和AnimateLocations兩種,其使用方法如下
//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());
},

默認(rèn)動畫只需要修改animationManager.initialAnimationStyle屬性就可以實現(xiàn)
通過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();
})
});
}
如果給節(jié)點的繪圖屬性進(jìn)行修改的過程中添加動畫的話,則需要在屬性的配置下面通過new go.AnimationTrigger來配置需要添加動畫的屬性值,然后在按鈕的點擊事件綁定的函數(shù)animateTrigger中,在函數(shù)中對添加了動畫的屬性進(jìn)行一個修改操作就可以了。
刪除節(jié)點的動畫
在節(jié)點的刪除過程中可以添加一個動畫,但是節(jié)點刪除之后畫布中就不存在節(jié)點了。因此在刪除的時候需要拷貝一下節(jié)點的信息,對拷貝的節(jié)點對象通過Animation.add進(jìn)行動畫處理。在下面的示例中,我們利用前面的選中節(jié)點的刪除的監(jiān)聽方法SelectionDeleting進(jìn)行操作。
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();
});
});

提示性的回彈動畫
在很多場景中需要對操作過程有一個反饋,因此提供了一些提示性的回彈動畫,比如縮小之后恢復(fù)原樣,放大之后恢復(fù)原樣的過程。代碼示例如下
//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();
}
通過創(chuàng)建動畫實例,然后通過animation.add方法可以實現(xiàn)對angle、position、scale的動畫操作。 這里需要注意的是,在每次動畫的函數(shù)開始必須通過animationManager.stopAnimation方法來停止動畫,否則的話,動畫會在上一個動畫的中間時刻就運(yùn)行下一個動畫,會造成圖形變形,下面zoomOut方法為例。

總結(jié)
本文主要介紹了gojs內(nèi)部已經(jīng)封裝的一些動畫的配置和使用方法,有了動畫的引入,不僅僅可以讓操作過程變得很絲滑,很好的提高的用戶的體驗。并且讓比如刪除節(jié)點這種沒有感覺的操作增加刪除的觀感。后面會對動畫的自定義方法進(jìn)行一個介紹。
以上就是GoJs中的動畫使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于GoJs動畫使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Bootstrap實現(xiàn)導(dǎo)航欄的2種方式
這篇文章主要為大家詳細(xì)介紹了Bootstrap實現(xiàn)導(dǎo)航欄的2種方式,一是利用按鈕組實現(xiàn)、二是Bootstrap專門做了相應(yīng)的css類,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
JS中用try catch對代碼運(yùn)行的性能影響分析
要捕獲JavaScript代碼中的異常一般會采用 try catch,不過try catch的使用是否是對代碼性能產(chǎn)生影響呢?答案是肯定有的,但是有多少不得而知。下面這篇文章就給大家詳細(xì)介紹了在JS中用try catch對代碼運(yùn)行的性能影響,有需要的朋友們可以參考借鑒。2016-12-12
詳解layui?laydate選擇時間的回調(diào)方法
這篇文章主要介紹了layui?laydate選擇時間的回調(diào)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01

