理解一个触摸事件可以从时间和空间两方面考虑。

1、触摸事件的时间方面

触摸事件的在时间方面,如下图所示,可以有不同的“按下”、“移动”和“抬起”等阶段,表示触摸是否刚刚开始、是否正在移动或处于静止状态,以及何时结束,也就是手指何时从屏幕抬起。此外,触摸事件的不同阶段都可以有单点触摸或多点触摸,是否支持多点触摸还要看设备和平台。

触摸事件有两个事件监听器:EventListenerTouchOneByOne和EventListenerTouchAllAtOnce ,分别对应单点触摸和多点触摸。这些监听器有一些触摸事件响应属性,这些属性对应着触摸事件不同阶段。通过设置这些属性能够实现事件与事件处理者函数的关联。

EventListenerTouchOneByOne中触摸事件响应属性:

std::function<bool(Touch*,Event*)> onTouchBegan。当一个手指触碰屏幕时回调该属性所指定函数。如果函数返回值为true,则可以回调后面的两个属性(onTouchMoved和onTouchEnded)所指定的函数,否则不回调。

std::function<void(Touch*,Event*)> onTouchMoved。当一个手指在屏幕移动时回调该属性所的指定函数。

std::function<void(Touch*,Event*)> onTouchEnded。当一个手指离开屏幕时回调该属性所的指定函数。

std::function<void(Touch*,Event*)> onTouchCancelled。当单点触摸事件被取消时候回调该属性所的指定函数。

说明 std::function是一种通用的函数封装。std::function的实例可以是任何可以调用的目标,这些目标包括:函数、Lambda表达式、绑定表达式以及其它函数对象等。

EventListenerTouchAllAtOnce 中触摸事件响应属性:

std::function<void(conststd::vector<Touch*>&, Event*)> onTouchesBegan。当多个手指触碰屏幕时回调该属性所指定的函数。

std::function<void(conststd::vector<Touch*>&, Event*)> onTouchesEnded。当多个手指在屏幕上移动时回调该属性所指定的函数。

std::function<void(conststd::vector<Touch*>&, Event*)> onTouchesMoved。当多个手指离开屏幕时回调该属性所指定的函数。

std::function<void(conststd::vector<Touch*>&, Event*)> onTouchesCancelled。当多点触摸事件被取消时回调该属性所指定的函数。

使用这些属性的代码片段演示了它们的使用:

  1. auto listener =EventListenerTouchOneByOne::create();
  2. listener->onTouchBegan =CC_CALLBACK_2(HelloWorld::touchBegan, this);
  3. ... ...
  4. bool HelloWorld::touchBegan(Touch*touch, Event* event) {
  5. ......
  6. returnfalse;
  7. }

首先我们需要使用EventListenerTouchOneByOne::create()创建单独触摸事件监听器对象。然后设置它的listener->onTouchBegan属性,其中CC_CALLBACK_2(HelloWorld::touchBegan, this)是使用CC_CALLBACK_2宏绑定回调函数,该函数是下面定义的bool HelloWorld::touchBegan(Touch*touch, Event* event)函数。

其它触摸事件的阶段也需要采用类似的代码,这里不再赘述。

2、触摸事件的空间方面

空间方面就是每个触摸点(Touch)对象包含了当前位置信息,以及之前的位置信息(如果有的话),下面的函数是可以获得触摸点之前的位置信息:

Point getPreviousLocationInView()                 //UI坐标

Point getPreviousLocation()                            //OpenGL坐标

下面的函数是可以获得触摸点当前的位置信息。

Point getLocationInView()                      //UI坐标

Point getLocation()                                           //OpenGL坐标

更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
本书交流讨论网站:http://www.cocoagame.net
欢迎加入cocos2d-x技术讨论群:257760386、327403678

Cocos2d-x中触摸事件的更多相关文章

  1. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  2. cocos2dx 中触摸事件分发一些解读

    触摸事件分发中几个代码解读: 怎么说呢,感觉cocos2dx中的消息分发机制,相对于android中触摸事件分发机制要简单的多.因为android中要做区域判断,过滤器,以及父子组件分发给谁等等的逻辑 ...

  3. 一个demo让你彻底理解Android中触摸事件的分发

    注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...

  4. UIView中触摸事件touchBegin

    UIView触摸事件touchBegin 等一系列方法 1)手指按下 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; ...

  5. 【转载】Quick 中的触摸事件

    原文地址 http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/fram ...

  6. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

  7. 图解Android触摸事件分发

    Android中触摸事件传递过程中最重要的是dispatchTouchEvent().onInterceptTouchEvent()和onTouchEvent()方法. View和Activity有d ...

  8. iOS开发系列之触摸事件

    基础知识 三类事件中触摸事件在iOS中是最常用的事件,这里我们首先介绍触摸事件. 在下面的例子中定义一个KCImage,它继承于UIView,在KCImage中指定一个图片作为背景.定义一个视图控制器 ...

  9. 转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一 ...

随机推荐

  1. U3D中的协同等待函数

    WaitForSeconds.WaitForseconds等待函数; 创建一个yield指令,来等待给定的秒数; using UnityEngine; using System.Collections ...

  2. secureCRT使用VIM时对语法高亮

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  3. PostgreSQL的schema信息,存储于何处

    查看schema信息: [pgsql@localhost bin]$ ./psql psql () Type "help" for help. pgsql=# create sch ...

  4. hdu 5563 Clarke and five-pointed star 水题

    Clarke and five-pointed star Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/show ...

  5. pjsip视频通信开发(上层应用)之拨号键盘下部份拨号和删除功能

    我们开发的是视频电话,所以既可以视频通话,可以只有音频的通话,所以底部含有两个按钮,最后一个就是删除功能,如果输入错误,我们可以删除输入的内容. 这里我们要通过重写LinearLayout来实现这部份 ...

  6. delphi label1 文字在窗体上水平来回移动

    //文字在窗体上水平来回移动 procedure TForm1.Timer1Timer(Sender: TObject);{ Timer1.Interval:=10;}begin  if label1 ...

  7. SiteMesh学习笔记

    SiteMesh是一个轻量级的web应用框架,实现了Decorator模式.它的目标是将多个页面都将引用的jsp页面通过配置加载到相应的jsp文件中. 在我们的项目中,每个jsp都需要添加两个top和 ...

  8. MySQL · 特性分析 · MDL 实现分析

    http://mysql.taobao.org/monthly/2015/11/04/ 前言 在MySQL中,DDL是不属于事务范畴的,如果事务和DDL并行执行,操作相关联的表的话,会出现各种意想不到 ...

  9. How to Check if an Array Contains a Value in Java Efficiently?---reference

    How to check if an array (unsorted) contains a certain value? This is a very useful and frequently u ...

  10. Redis 有序集合(sorted set)

    Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序 ...