HTML5触摸事件(多点、单点触控)

本文转自:http://www.360us.net/article/9.html

HTML5的触摸API支持处理单点和多点的触摸事件处理。

接口

1、TouchEvent:代表了一个触摸事件。

主要属性:

TouchEvent.changedTouches:一个TouchList对象。代表了所有上一个接触点到当前点状态发生变化的点。

TouchEvent.touches:一个TouchList对象。代表的所有当前触摸点,不管目标或者状态是否改变。

TouchEvent.type:触摸事件类型。有touchstart、touchend、touchmove、touchenter、touchleave和touchleave。

2、Touch:代表一个单独的触摸点。

主要属性:Touch.identifier:这个触摸对象的唯一标识。

3、TouchList:代表一组触摸点。比如同时有多根手指放在在屏幕上面。

4、DocumentTouch:包含创建Touch和TouchList对象的方法。

 

触摸事件

  1. touchstart:触摸的时候发生。

  2. touchend:手指从屏幕抬起时发生。手指划出了屏幕也会触发这个事件。

  3. touchmove:手指沿着屏幕滑动时触发。

  4. touchenter:触摸点进入到一个元素。

  5. touchleave:触摸点离开一个元素。

  6. touchcancel:当触摸受到干扰而中断时触发。比如一个弹框,或者触摸点离开了文档窗口区域到了其他地方,或者触摸点超出了最大可支持的上限,那么最先的触摸将会退出。

 

下面一个跟踪多点触控的例子,允许用户同时多于一个手指画线,可以直接运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<!DOCTYPE html>
<html>
     <head><title>Touch Test</title></head>
     <body>
         <canvas id= "canvas"  width= "600"  height= "600"  style= "border:solid black 1px;" >
           Your browser does not support canvas element.
         </canvas>
         <br>
         <br>
         Log: <pre id= "log"  style= "border: 1px solid #ccc;" ></pre>
         <script type= "text/javascript" >
             document.body.onload = startup;  //文档加载完毕触发
 
             var  ongoingTouches =  new  Array();  //用来保存跟踪正在发送的触摸事件
 
             //设置事件处理程序
             function  startup() {
               var  el = document.getElementsByTagName( "canvas" )[0];
               el.addEventListener( "touchstart" , handleStart,  false );
               el.addEventListener( "touchend" , handleEnd,  false );
               el.addEventListener( "touchcancel" , handleCancel,  false );
               el.addEventListener( "touchleave" , handleEnd,  false );
               el.addEventListener( "touchmove" , handleMove,  false );
               log( "initialized." );
             }
 
             //处理触摸开始事件
             function  handleStart(evt) {
               evt.preventDefault();  //阻止事件的默认行为
               log( "touchstart." );
               var  el = document.getElementsByTagName( "canvas" )[0];
               var  ctx = el.getContext( "2d" );
               var  touches = evt.changedTouches;
                     
               for  ( var  i=0; i < touches.length; i++) {
                 log( "touchstart:" +i+ "..." );
                 ongoingTouches.push(copyTouch(touches[i]));
                 var  color = colorForTouch(touches[i]);
                 ctx.beginPath();
                 ctx.arc(touches[i].pageX, touches[i].pageY, 4, 0,2*Math.PI,  false );   // a circle at the start
                 ctx.fillStyle = color;
                 ctx.fill();
                 log( "touchstart:" +i+ "." );
               }
             }
 
             //处理触摸移动事件
             function  handleMove(evt) {
               evt.preventDefault();
               var  el = document.getElementsByTagName( "canvas" )[0];
               var  ctx = el.getContext( "2d" );
               var  touches = evt.changedTouches;
 
               for  ( var  i=0; i < touches.length; i++) {
                 var  color = colorForTouch(touches[i]);
                 var  idx = ongoingTouchIndexById(touches[i].identifier);
 
                 if (idx >= 0) {
                   log( "continuing touch " +idx);
                   ctx.beginPath();
                   log( "ctx.moveTo(" +ongoingTouches[idx].pageX+ ", " +ongoingTouches[idx].pageY+ ");" );
                   ctx.moveTo(ongoingTouches[idx].pageX, ongoingTouches[idx].pageY);
                   log( "ctx.lineTo(" +touches[i].pageX+ ", " +touches[i].pageY+ ");" );
                   ctx.lineTo(touches[i].pageX, touches[i].pageY);
                   ctx.lineWidth = 4;
                   ctx.strokeStyle = color;
                   ctx.stroke();
 
                   ongoingTouches.splice(idx, 1, copyTouch(touches[i]));   // swap in the new touch record
                   log( "." );
                 else  {
                   log( "can't figure out which touch to continue" );
                 }
               }
             }
 
             //处理触摸结束事件
             function  handleEnd(evt) {
               evt.preventDefault();
               log( "touchend/touchleave." );
               var  el = document.getElementsByTagName( "canvas" )[0];
               var  ctx = el.getContext( "2d" );
               var  touches = evt.changedTouches;
 
               for  ( var  i=0; i < touches.length; i++) {
                 var  color = colorForTouch(touches[i]);
                 var  idx = ongoingTouchIndexById(touches[i].identifier);
 
                 if (idx >= 0) {
                   ctx.lineWidth = 4;
                   ctx.fillStyle = color;
                   ctx.beginPath();
                   ctx.moveTo(ongoingTouches[idx].pageX, ongoingTouches[idx].pageY);
                   ctx.lineTo(touches[i].pageX, touches[i].pageY);
                   ctx.fillRect(touches[i].pageX-4, touches[i].pageY-4, 8, 8);   // and a square at the end
                   ongoingTouches.splice(idx, 1);   // remove it; we're done
                 else  {
                   log( "can't figure out which touch to end" );
                 }
               }
             }
 
             //处理触摸对出事件
             function  handleCancel(evt) {
               evt.preventDefault();
               log( "touchcancel." );
               var  touches = evt.changedTouches;
               
               for  ( var  i=0; i < touches.length; i++) {
                 ongoingTouches.splice(i, 1);   // remove it; we're done
               }
             }
 
             //选择颜色
             function  colorForTouch(touch) {
               var  r = touch.identifier % 16;
               var  g = Math.floor(touch.identifier / 3) % 16;
               var  b = Math.floor(touch.identifier / 7) % 16;
               r = r.toString(16);  // make it a hex digit
               g = g.toString(16);  // make it a hex digit
               b = b.toString(16);  // make it a hex digit
               var  color =  "#"  + r + g + b;
               log( "color for touch with identifier "  + touch.identifier +  " = "  + color);
               return  color;
             }
 
             //拷贝一个触摸对象
             function  copyTouch(touch) {
               return  { identifier: touch.identifier, pageX: touch.pageX, pageY: touch.pageY };
             }
 
             //找出正在进行的触摸
             function  ongoingTouchIndexById(idToFind) {
               for  ( var  i=0; i < ongoingTouches.length; i++) {
                 var  id = ongoingTouches[i].identifier;
                 
                 if  (id == idToFind) {
                   return  i;
                 }
               }
               return  -1;     // not found
             }
 
             //记录日志
             function  log(msg) {
               var  p = document.getElementById( 'log' );
               p.innerHTML = msg +  "\n"  + p.innerHTML;
             }
         </script>
     </body>
</html>

文章参考地址及示例来源:https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Touch_events

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos(也称为Cocos2d-x)是一款用于开发游戏和交互式应用程序的开源跨平台游戏引擎。它支持多点触控,允许开发者在应用程序中实现多个手指的触摸操作。 在Cocos中,多点触控功能可以通过以下方式实现: 1. 触摸事件:Cocos提供了处理触摸事件的功能,包括开始、移动和结束事件。开发者可以通过注册触摸事件处理函数来监听这些事件,并在函数中处理多个手指的触摸操作。 2. 触摸监听:Cocos提供了触摸监听器类,例如`EventListenerTouchOneByOne`,它允许开发者单独处理每个触摸事件。通过创建一个触摸监听器,并将其附加到事件循环中,可以监听并响应多个手指的触摸操作。 3. 触摸区域:Cocos提供了触摸区域的概念,即当多个手指在屏幕上同时触摸时,它们所在的区域。开发者可以使用`Rect`类来表示触摸区域,并在代码中处理与该区域相关的操作。 4. 手势识别:Cocos还支持手势识别,包括双指缩放、捏合和旋转等。通过使用手势识别器类,如`EventListenerGesture`,开发者可以识别并响应这些手势,并在应用程序中实现相应的功能。 总之,Cocos是一款支持多点触控的跨平台游戏引擎,开发者可以使用它来开发具有多点触控功能的游戏和应用。通过注册触摸事件处理函数、使用触摸监听器和触摸区域、以及识别手势,可以轻松实现多点触控功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值