KineticJS教程(5)
KineticJS教程(5)
5.事件响应
5.1.图形的事件响应
图形对象对事件的响应处理可以使用 on() 方法绑定事件类型和相应方法。 On() 方法需要一个事件类型参数和相应方法,其中所支持的事件类型包括: mouseover, mouseout, mousemove, mousedown, mouseup, click, dblclick, dragstart 以及 dragend 事件。默认情况下,图形对象事件响应使用的是路径检测方法,下一节还会介绍像素检测方法。
绑定代码如下:
<script>
shape.on(“click”, function(evt){
// 事件响应代码
});
</script>
如下代码绘制一个矩形,并相应鼠标在此矩形上的点击操作,弹出消息框:
<!DOCTYPE html>
<html>
<head>
<meta charset=“UTF-8″>
<title>KineticJS</title>
<script src=“../kinetic.js”></script>
</head>
<body>
<script>
window.onload = function() {
var stage = new Kinetic.Stage({
container : “container”,
width : 600,
height : 400
});
var layer = new Kinetic.Layer();
//创建config参数
var config = {
x : 200,
y : 150,
width : 200,
height : 100,
fill : “blue”,
stroke : “black”,
strokeWidth : 4
};
//创建矩形对象
var rect = new Kinetic.Rect(config);
//绑定事件响应方法
rect.on(“click”, function() {
alert(“clicked”);
});
//把矩形对象添加到层里
layer.add(rect);
//将层添加到舞台中
stage.add(layer);
};
</script>
<div id=“container”></div>
</body>
</html>
5.2.像素检测
对于图像、线条和文本之类的对象,路径检测就不太合适,这时就需要使用像素检测方法来响应事件。为了使用像素检测,就需要为图形图像对象的检测类型detectionType设置为像素检测pixel。这个值默认是路径检测path。
<script>
// 在构造方法的config中指定检测类型
var image = new Kinetic.Image({
detectionType: “pixel”
});
// 或者是用对象方法设定检测类型
image.setDetectionType(“pixel”);
</script>
然后,Kinetic还需要用对象的saveData()来保存数据才可以使用像素检测功能。另外还可以用clearData()来清除保存的数据。但要注意的是,saveData()需要在对象所在的层被添加到舞台上以后才能使用,否则会出错。
<script>
// 保存图像数据
image.saveData();
// 清除图像数据
image.clearData();
</script>
<!DOCTYPE html>
<html>
<head>
<meta charset=“UTF-8″>
<title>KineticJS</title>
<script src=“../kinetic.js”></script>
</head>
<body>
<script>
var stage;
function loadImage() {
var image = new Image();
image.onload = function() {
var kimage = new Kinetic.Image({
x : 100,
y : 100,
image : image,
detectionType : “pixel”
});
//绑定事件响应方法
kimage.on(“click”, function() {
alert(“image clicked”);
});
var layer = new Kinetic.Layer();
layer.add(kimage);
stage.add(layer);
//保存数据以相应事件
kimage.saveData();
};
//图像需要与此页面在同一个服务器上,否则会Javascript会抛出安全异常
image.src = “http://localhost/FSM.jpg”;
}
window.onload = function() {
stage = new Kinetic.Stage({
container : “container”,
width : 600,
height : 400
});
var rect = new Kinetic.Rect({
x : 400,
y : 100,
width : 100,
height : 100,
fill : “red”,
detectionType : “pixel”
});
//绑定事件响应方法
rect.on(“click”, function() {
alert(“rect clicked”);
});
var layer = new Kinetic.Layer();
layer.add(rect);
stage.add(layer);
//保存数据以相应事件
rect.saveData();
loadImage();
};
</script>
<div id=“container”></div>
</body>
</html>
5.3.事件命名
对于同一个事件,可以通过对事件进行命名绑定多个事件处理方法。事件的命名格式遵循“事件类型.自定义名称“。比如,针对鼠标点击事件“click“,可以命名两个事件处理方法“click.a”和“click.b”分别绑定各自的事件处理方法:
//创建矩形对象
var rect = new Kinetic.Rect(config);
//绑定消息响应方法
rect.on(“click.a”, function() {
alert(“clicked a”);
});
rect.on(“click.b”, function() {
alert(“clicked b”);
});
//把矩形对象添加到层里
layer.add(rect);
//将层添加到舞台中
stage.add(layer);
点击这个矩形的时候会依次调用这两个绑定的方法,弹出两个消息框。
5.4.鼠标位置的获取
在响应鼠标事件的时候常常需要获取鼠标位置信息,这时可以在事件响应方法中使用舞台对象的getMousePosition方法获取鼠标位置:
//绑定事件响应方法
rect.on(“click”, function() {
var mousePos = stage.getMousePosition();
var msg = “x:”+mousePos.x+” | “+“y:”+mousePos.y;
alert(msg);
});
当然,要注意的是,这个坐标是相对于舞台左上角的,而不是绑定的图像左上角。
5.5.多事件绑定
如果希望同时相应多个不同的事件,可以在on方法绑定事件处理方法的时候,在事件参数中以空格分隔不同的事件,如下在鼠标按下和移过的时候都调用此处理方法:
<script>
shape.on(“mousedown mouseover”function(evt) {
// 事件响应代码
});
</script>
5.6.取消事件绑定
要取消对某个事件的相应绑定,只需要用图形对象的off方法,参数即要取消的事件名称,如下代码取消了鼠标点击事件的相应:
<script>
shape.off(“click”);
</script>
对于有多个自定义命名的事件,比如上文中的“click.a“和“click.b“,使用shape.off(“click”)会将两个事件处理的绑定都取消掉,如果只是单独取消其中某个,可以如下操作:
<script>
shape.off(“click.a”);
</script>
或
<script>
shape.off(“click.b”);
</script>
5.7.事件监听开关
Kinetic中还可以通过设定listening属性的方法来确定是否要监听事件。如果设为false,则绑定的事件响应方法会被忽略不执行。
<script>
// 在构造方法的config参数中设置
var shape = new Kinetic.Circle({
listening: false
});
// 使用对象方法设置
shape.listen(true);
</script>
5.8.禁止事件向上级对象传递
如果某个图形对象属于某个组,则某个发生在图形上的事件会被依次传递到图形对象、组、层,那么如果这三者都绑定了此事件的相应方法,那么这些方法也会被依次执行。
那么如果希望在本对象处理事件后事件不再继续向上级传递,则可以在绑定事件处理方法时如下用方法的evt参数处理:
<script>
shape.on(“click”, function(evt) {
evt.cancelBubble = true;
});
</script>
5.9.在事件处理方法中获取图形对象
同样也是用在绑定事件处理方法时方法的evt参数获取当前事件绑定的图形对象:
<script>
shape.on(“click”, function(evt) {
var shape = evt.shape;
});
</script>
然后就可以在事件处理方法中对图形对象进行操作了。
5.10.触发事件响应方法
除了由用户交互操作出发事件而执行响应方法外,还可以在代码里用simulate方法触发事件。
比如:
<script>
// 图形对象绑定了鼠标点击事件
shape.on(“click”, function(evt){
// 事件处理
});
// 触发事件鼠标点击事件
shape.simulate(“click”);
</script>
5.11.移动设备的触摸屏事件响应
触摸屏的事件响应与普通电脑的响应处理方法类似,只是事件类型的名称略有不同。Kinetic支持的触摸屏事件包括touchstart, touchmove, touchend, tap, dbltap, dragstart, dragmove 以及 dragend。
而触摸点坐标的获取就不是用getMousePosition(evt),而是触摸屏专用方法getTouchPosition(evt)或者桌面与触摸屏通用方法getUserPosition(evt)。
KineticJS教程(5)的更多相关文章
- KineticJS教程(12)
KineticJS教程(12) 作者: ysm 12.舞台 12.1.舞台的大小 舞台创建后还可以用舞台对象的setSize(width, height)方法来设置舞台的宽度与高度. <scr ...
- KineticJS教程(11)
KineticJS教程(11) 作者: ysm 11.对象的上下关系 11.1.层的上下关系 Kinetic的层是按照添加到舞台的次序,由下向上排列,上层遮盖下层的图形.每个层各自有一个ZIndex编 ...
- KineticJS教程(10)
KineticJS教程(10) 作者: ysm 10.在容器之间移动图形对象 Kinetic支持通过图形对象的moveTo(container)方法把图形对象从一个容器移动到另一个容器里,这个容器指 ...
- KineticJS教程(9)
KineticJS教程(9) 作者: ysm 9.选择器 Kinetic在舞台.层和组对象上都提供了get方法,用于返回这三者中包含的对象. 9.1.根据ID获取对象 要用id获取对象,首先要给对象 ...
- KineticJS教程(8)
KineticJS教程(8) 作者: ysm 8.动画 动画就是一帧帧的画面按照时间间隔显示出来,Kinetic给我们提供了一个舞台对象的onFrame方法,用这个方法可以绑定一个动画方法,我们要显 ...
- KineticJS教程(7)
KineticJS教程(7) 作者: ysm 7.图形变换 7.1.线性变化 Kinetic提供了一个图形对象的transitionTo(config)方法实现图形的线性变换,也就是从原始的状态线性变 ...
- KineticJS教程(6)
KineticJS教程(6) 作者: ysm 6.拖拽 6.1.拖拽功能 要实现Kinetic对象的拖拽功能很简单,只需要将图形对象的draggable属性设为true就可以了. <script ...
- KineticJS教程(4)
KineticJS教程(4) 作者: ysm 4.图形样式 4.1.填充 Kinetic中图形的填充属性可以在构造方法中的config参数中的fill属性进行设定,也可以用图形对象的setFill方 ...
- KineticJS教程(3)
KineticJS教程(3) 作者: ysm 3.图形对象 3.1.Shape Kinetic提供了一个Shape对象用于在层上绘制图形,我们可以通过Kinetic.Shape()构造方法返回一个S ...
随机推荐
- 【BZOJ 4027】 4027: [HEOI2015]兔子与樱花 (贪心)
4027: [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号 ...
- 【UOJ #205】【APIO 2016】Fireworks
http://uoj.ac/problem/205 好神的题啊. dp[i][j]表示以i为根的子树调整成长度j需要的最小代价. 首先要观察到dp值是一个下凸壳. 因为从儿子合并到父亲时要把所有儿子的 ...
- noip2012疫情控制 题解
题目大意 给出一棵n个节点的树,根是1,要在除根节点以外的点建立检查点,使得从每条根到叶子的路径上都至少存在一个检查点.检查点由军队来建立.初始军队的位置是给定的,移动军队走一条边需要花费这条边的权值 ...
- 我的OI生涯 第三章
第三章 日子过得就像那些不眠的晚上,她嚼着口香糖对墙满谈着理想.——————赵雷<成都> NOIP过后我认识到了自己有多么菜,我换了座,到了靠窗户那排. 大王开始给我们介绍一些高端算法,那 ...
- [BZOJ3926][ZJOI2015]诸神眷顾的幻想乡(后缀自动机)
日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去 ...
- 【SDOI2017】树点染色【线段树+LCT】
本来只是想练练LCT,没想到是个线段树 对于操作1:诶新的颜色?这不是access吗? 也就是说,我们用一棵splay来表示一种颜色 操作2直接在LCT上乱搞-- 不对啊,操作3要查子树 诶好像是静态 ...
- [置顶] getopt_long函数基本用法-linux
一.感性认识: [c-sharp] view plain copy #include <stdio.h> #include <getopt.h> char * l_opt ...
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式
JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于JavaScript(Standard ECMA-262 3rd Edition - D ...
- 下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21-Ubuntu SMP Thu Apr 6 17:04:57 ...
- Visual Studio IDE 背景色该为保护眼睛色
将背景颜色改成你想要的背景颜色. 将色调改为:85.饱和度:123.亮度:205->添加到自定义颜色->在自定义颜色选定点确定 就搞定了!