索引
HT
系统可通过入门手册介绍的ht.Default.startAnim
函数,
或者调度手册介绍的DataModel#addScheduleTask
函数,动态改变模型属性以达到动画效果。
本手册将要介绍的动画插件则更进一步对动画进行封装,用户只需用描述性的说明HT
即可自动实现动画过程,动画插件可以将图元的一个或多个属性值
(如width
、height
、opacity
等)从一个值平滑的缓动至另一个值,同时提供了丰富的缓动方式用于实现各种效果,如闪烁、跳跃、变色等。
使用此插件之前,需要引入ht-animation.js
文件:
<script src="ht.js"></script> <!--先引入ht.js-->
<script src="ht-animation.js"></script>
要使用动画,首先您需要调用ht.DataModel#enableAnimation(interval)
启动全局动画定时器,参数interval
指定全局动画间隔,默认为requestAnimFrame
的时间(16ms
左右,因浏览器而异),
也就是说,如果不指定interval
参数,DataModel
定时器每隔16ms
左右就会遍历自己所有的Data
,根据Data
的animation
配置执行动画
除了enableAnimation
,DataModel
上还有另外两个API
经常用到:
disableAnimation()
停止全局动画定时器,如果不需要动画请关闭定时器,不然会造成性能浪费getDataAnimation(data)
获得参数data
的动画配置,如果不想为每个Data
指定animation
参数,而是希望根据Data
种类或标识生成动画配置,
可以重写此方法实现(参考示例二)此插件在ht.Data
上扩展了一个setAnimation(config)
方法用于配置当前图元的动画设置,一个简单的配置示例如下:
data.setAnimation({
show: {
property: "opacity",
accessType: "style",
from: 1,
to: 0,
repeat: true
},
start: ["show"]
});
可以看到,参数config
是一个js
对象,在这个对象里除了start
有特殊含义,您可以使用任意字符串定义一个或多个动画过程
上面的配置中,定义了一个名为show
的动画过程,这个动画过程改变图元的opacity
样式(透明度),将其从1
变化至0
,repeat
表示动画一直会重复,直到您调用setAnimation(null)
清除动画。需要注意:
通过API清除动画后,属性可能处于任何状态,如上面的例子,opaciy样式可能是0-1之间的任何数字,您可能需要重设此样式。
start
是一个数组,用于指定要启动的一个或多个动画,上面的例子里只定义了一个名为show
的动画,事实上,您可以定义任意多个,动画的配置参数列举如下:
property
动画要改变的图元的属性名accessType
property
的类型,枚举如下:null
默认类型,如property
为width
,采用getWidth()
和setWidth(value)
的get/set
或is/set
方式存取。style
如property
为width
,采用getStyle('width')
和setStyle('width', value)
的方式存取。attr
如property
为width
,采用getAttr('width')
和setAttr('width', value)
的方式存取。from
动画开始时的属性值to
动画结束时的属性值frames
动画帧数,默认为60
duration
持续时间,单位 ms
;frames
和此参数只能选择一个,不可同时存在interval
动画间隔,单位ms
,如果不指定等同于全局动画间隔;适用于当前图元的动画间隔与全局动画间隔不一致的情况delay
动画延迟执行时间,单位ms
repeat
指定动画是否循环执行,如果为数字,表示循环的次数easing
动画方式,枚举如下:Linear、Quad.easeIn、Quad.easeOut、 Quad.easeInOut;Cubic.easeIn、Cubic.easeOut、 Cubic.easeInOut;
Quart.easeIn、Quart.easeOut、 Quart.easeInOut;Quint.easeIn、Quint.easeOut、 Quint.easeInOut;Sine.easeIn、Sine.easeOut、 Sine.easeInOut;
Expo.easeIn、Expo.easeOut、 Expo.easeInOut;Circ.easeIn、Circ.easeOut、 Circ.easeInOut;Elastic.easeIn、Elastic.easeOut、 Elastic.easeInOut;
Back.easeIn、Back.easeOut、 Back.easeInOut;Bounce.easeIn、Bounce.easeOut、 Bounce.easeInOut
这些动画方式有何区别?参考这里:http://easings.net/
onUpdate: function(value)
回调函数,动画的每一帧都会回调此函数。
onComplete: function()
回调函数,动画完成后执行next
字符串类型,指定当前动画完成之后,要执行的下个动画,可将多个动画融合ht.Data
上支持下面的函数用于暂停和继续动画:
pauseAnimation()
暂停动画resumeAnimation()
继续动画需要注意染色图元的配置:
node2.setAnimation({
blend: {
from: 255,
to: 0,
next: "clear",
onUpdate: function(value) {
value = parseInt(value);
this.s("body.color", "rgb(255, " + value + ", " + value + ")");
}
},
clear: {
from: 0,
to: 255,
next: "blend",
onUpdate: function(value) {
value = parseInt(value);
this.s("body.color", "rgb(255, " + value + ", " + value + ")");
}
},
start: ["blend"]
});
start
参数指定了从blend
动画开始执行,染色动画实际一直在改变图元的body.color
样式,这里我们没有指定property
和accessType
,因为
body.color
不是单纯的数字类型,而是一个表示RGB
颜色的字符串,所以我们用到了onUpdate
回调函数,每一帧都组合字符串改变图元的body.color
dm.getDataAnimation = function(data) {
if (data.getName() === "node1") {
if (data.getAnimation() != null) {
return data.getAnimation();
} else {
return {
hide: {
property: "opacity",
accessType: "style",
from: 1,
to: 0,
frames: 1,
next: "show"
},
show: {
property: "opacity",
accessType: "style",
from: 0,
to: 1,
frames: 1,
next: "hide"
},
start: ["hide"]
};
}
} else {
return null;
}
};
在这个例子里,我们没有调用ht.Data#setAnimation
,而是通过重写ht.DataModel#getDataAnimation
,根据图元的名字生成动画配置,
在某些要求灵活生成动画的场景下非常有用
这个例子演示如何让虚线样式流动起来:
这个例子演示如何让图元告警图标闪烁: