KineticJS教程(5)

作者: ysm 

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)的更多相关文章

  1. KineticJS教程(12)

    KineticJS教程(12) 作者: ysm  12.舞台 12.1.舞台的大小 舞台创建后还可以用舞台对象的setSize(width, height)方法来设置舞台的宽度与高度. <scr ...

  2. KineticJS教程(11)

    KineticJS教程(11) 作者: ysm 11.对象的上下关系 11.1.层的上下关系 Kinetic的层是按照添加到舞台的次序,由下向上排列,上层遮盖下层的图形.每个层各自有一个ZIndex编 ...

  3. KineticJS教程(10)

    KineticJS教程(10) 作者: ysm  10.在容器之间移动图形对象 Kinetic支持通过图形对象的moveTo(container)方法把图形对象从一个容器移动到另一个容器里,这个容器指 ...

  4. KineticJS教程(9)

    KineticJS教程(9) 作者: ysm  9.选择器 Kinetic在舞台.层和组对象上都提供了get方法,用于返回这三者中包含的对象. 9.1.根据ID获取对象 要用id获取对象,首先要给对象 ...

  5. KineticJS教程(8)

    KineticJS教程(8) 作者: ysm  8.动画 动画就是一帧帧的画面按照时间间隔显示出来,Kinetic给我们提供了一个舞台对象的onFrame方法,用这个方法可以绑定一个动画方法,我们要显 ...

  6. KineticJS教程(7)

    KineticJS教程(7) 作者: ysm 7.图形变换 7.1.线性变化 Kinetic提供了一个图形对象的transitionTo(config)方法实现图形的线性变换,也就是从原始的状态线性变 ...

  7. KineticJS教程(6)

    KineticJS教程(6) 作者: ysm 6.拖拽 6.1.拖拽功能 要实现Kinetic对象的拖拽功能很简单,只需要将图形对象的draggable属性设为true就可以了. <script ...

  8. KineticJS教程(4)

    KineticJS教程(4) 作者: ysm  4.图形样式 4.1.填充 Kinetic中图形的填充属性可以在构造方法中的config参数中的fill属性进行设定,也可以用图形对象的setFill方 ...

  9. KineticJS教程(3)

    KineticJS教程(3) 作者: ysm  3.图形对象 3.1.Shape Kinetic提供了一个Shape对象用于在层上绘制图形,我们可以通过Kinetic.Shape()构造方法返回一个S ...

随机推荐

  1. 【BZOJ-2734】集合选数 状压DP (思路题)

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1070  Solved: 623[Submit][Statu ...

  2. servlet中请求转发(forword)和重定向(redirect)的区别

    servlet请求转发与重定向的区别: request.setAttribute("test","hello"); request.getRequestDisp ...

  3. noip2011初赛提高组 试题详解

    转载自:https://blog.csdn.net/Eirlys_North/article/details/52889993 一.单项选择题(共20题,每题1.5分,共计30分,每题有且仅有一个正确 ...

  4. ACM -- 算法小结(一)利用数组存放实现排序

    利用数组存放实现排序    hodj1425   321MS   2011/08 题意:输入n个数字,要求输出从大到小排序的前m个数 解题技巧:利用大数存储在数组后面,小数存储在前面,倒序输出完成从大 ...

  5. python开发_email_读取邮件头信息

    在python中的类库中,python自带了email模块. 在email模块中,我们可以email类库实现对邮件的读取,和邮件的发送等功能. 本文先来谈谈在python中,利用email模块读取邮件 ...

  6. CDOJ 1288 旅游的Final柱 构造题

    旅游的Final柱 题目连接: http://acm.uestc.edu.cn/#/problem/show/1288 Description 柱神要去打Final啦~(≧▽≦)/~啦啦啦 柱神来到了 ...

  7. WEB安全扫描器Netsparker推荐给大家

    Netsparker是一款综合型的web应用安全漏洞扫描工具,它分为专业版和免费版,免费版的功能也比较强大. Netsparker与其他综合 性的web应用安全扫描工具相比的一个特点是它能够更好的检测 ...

  8. java内存泄露补充样例

    前几天写了个内存泄露的文章.里面介绍了内存泄露的相关知识:http://blog.csdn.net/u010590685/article/details/46973735 但是里面给的样例不是非常好, ...

  9. VB.net X86设置

    在Visual Studio中,在任何项目中点击右键,选择项目属性->编译->高级编译选项

  10. Android Binder总结

    1. MediapplayerService 的启动,怎样在ServiceManager注冊的,不解说详细的细节 ServiceManager 是整个系统的Service总管,其余的系统服务都是通过d ...