3.x的触摸响应机制

第一种是采用函数回调,主要是用于MenuItem

[cpp] view plaincopy

  1. // a selector callback
  2. void menuCloseCallback(Object* pSender);
  3. auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",
  4. CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
  5. void HelloWorld::menuCloseCallback(Object* pSender)
  6. {
  7. Director::getInstance()->end();
  8. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  9. exit(0);
  10. #endif
  11. }

从上面的代码也可以看得到3.0的一些改变

用CC_CALLBACK_x代替了 按钮的 menu_selector(),update的 schedule_selector 回调接口,其中最后一个x代表着回调函数的参数有几个,0表示0个,1表示1个,2表示2个,上面的例子是1个参数,所以用CC_CALLBACK_1

第二种方法我也不是很明白,TouchEvent响应

这是新加入的响应方式。它主要是使用在UIWidget上的。可以将其看做是函数回调的一个扩展,为更多的响应处理提供可能。使用方法大致是:

[cpp] view plaincopy

  1. //声明
  2. void touchButton(Object* object,TouchEventType type);
  3. //挂接到控件上
  4. uiButton->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));
  5. //实现
  6. void HelloWorld::touchButton(Object* object,TouchEventType type)
  7. {
  8. LabelTTF* label;
  9. switch (type)
  10. {
  11. case TouchEventType::TOUCH_EVENT_BEGAN:
  12. label = static_cast(getChildByTag(11));
  13. label->setString("按下按钮");
  14. break;
  15. case TouchEventType::TOUCH_EVENT_MOVED:
  16. label = static_cast(getChildByTag(11));
  17. label->setString("按下按钮移动");
  18. break;
  19. case TouchEventType::TOUCH_EVENT_ENDED:
  20. label = static_cast(getChildByTag(11));
  21. label->setString("放开按钮");
  22. break;
  23. case TouchEventType::TOUCH_EVENT_CANCELED:
  24. label = static_cast(getChildByTag(11));
  25. label->setString("取消点击");
  26. break;
  27. default:
  28. break;
  29. }
  30. }

因为所有的UIWidget都要添加到UILayer上,而UILayer通常都会在最上层,所以可以“基本上”认为这种使用方式会优先于其他方式处理点击消息。因为UILayer也会有层级的改变,比如它和MenuItem之间的关系。所以说“基本上”。

第三种 触摸监听绑定

我觉得这种方法相当方便,不仅可以绑定在精灵上,还可以绑定在层上,触摸函数也可以用lambda来写。下面是方法

[cpp] view plaincopy

  1. auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听
  2. listener1->setSwallowTouches(true);//设置是否想下传递触摸
  3. Rect rect = Rect(qipanPoint.x,qipanPoint.y
  4. ,qipanSize.width,qipanSize.height);
  5. //3.0 后可以直接在touchBegan后添加它的实现代码,而不用特意去写一个touchBegan的函数
  6. listener1->onTouchBegan = [rect,this](Touch* touch, Event* event){ //[]中间的是传入的参数
  7. auto target = static_cast(event->getCurrentTarget());//获取的当前触摸的目标
  8. Point locationInNode = target->convertToNodeSpace(touch->getLocation());
  9. Size s = target->getContentSize();
  10. if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
  11. {"white-space:pre"> //以下是我自定义的一些操作
  12. //创建锁定精灵
  13. auto lockSprite = Sprite::create("lock.png");
  14. lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
  15. lockSprite->setTag(99);
  16. this->addChild(lockSprite);
  17. return true;
  18. }else
  19. return false;
  20. };
  21. //拖动精灵移动
  22. listener1->onTouchMoved = [rect,this](Touch* touch, Event* event){
  23. auto target = static_cast(event->getCurrentTarget());//获取的当前触摸的目标
  24. Point locationInNode = target->convertToNodeSpace(touch->getLocation());
  25. Size s = target->getContentSize();
  26. if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
  27. {
  28. //锁定精灵移动
  29. Sprite *lockSprite = (Sprite*)this->getChildByTag(99);
  30. lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
  31. }
  32. };
  33. listener1->onTouchEnded = [=](Touch* touch, Event* event){ // =在c++11里面代表这个lambda表达式中能使用外面的变量
  34. this->removeChildByTag(99);//移除锁定精灵
  35. };
  36. //将触摸监听添加到eventDispacher中去
  37. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1 ,layer);

第四种

  1. auto listener = EventListenerTouchOneByOne::create();//创建一个触摸监听(单点触摸)
  2. listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);//指定触摸的回调函数
  3. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,listen_layer);//将listener和layer绑定,放入事件委托中
  4. bool HelloWorld::onTouchBegan(Touch* touch, Event  *event)
  5. {
  6. auto point = Director::getInstance()->convertToGL(touch->getLocationInView());//获得当前触摸的坐标
  7. auto rect = Rect(160-30,400-30,60,60);//设置框坐标和大小处于close 按钮的位置上
  8. if(rect.containsPoint(point))//如果触点处于rect中
  9. {
  10. auto menu = (Menu*)this->getChildByTag(99);//通过tag获取到menu
  11. auto item = (MenuItem*)menu->getChildByTag(99);//通过tag从menu中获取item
  12. item->activate();//让item响应
  13. }
  14. return true;//返回true表示接收触摸事件
  15. }

来自为知笔记(Wiz)

时间: 2024-10-11 03:49:11

3.x的触摸响应机制的相关文章

(二)理解触摸响应

[写在该系列之前] 该系列为索尼关于智能手机触摸屏的文章,共四篇,对Android智能手机触摸体系做了系统并详细的说明. 注1:虽然做了翻译,但还是认为原文更准确,若可以,请大家移步原文:http://developer.sonymobile.com/tag/touch/ 注2:若有错误,肯请大家指正,先行谢过. 理解触摸响应 这是我们触摸屏技术系列中的第二篇文章.在前一篇文章中,我们解释了触摸屏系统的组件和这些组件如何将一个触摸输入转换成图形化用户反馈.在这篇文章中,我们将继续触摸响应话题,并

MFC消息响应机制 q

MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows API函数和Windows控件,使得程序的开发变得简单,极大的缩短了程序的开发 周期.MFC独创的Document/View框架结构,能够将管理数据的代码和显示数据的程序代码分开,并且设计了 一套方便的消息映射和命令传递机制,方便程序员的开发使用.其中消息映射机制本身比较庞大和复杂,对 它的分析和了

Anroid View事件响应机制和ViewGroup的事件响应分发机制

注:低版本的源码内容比高版本的源码简单,分析起来方便,但是高版本源码更为严密. View的事件响应机制 涉及2个方法dispatchTouchEvent和onTouchEvent 1.View的dispatchTouchEvent方法(事件传递到View,View的这个方法就自动执行.) dispatchTouchEvent返回true,响应事件:返回false,不响应事件. public boolean dispatchTouchEvent(MotionEvent event) { ... L

自定义View的触摸响应时间间隔可以自已定义么

============问题描述============ ============解决方案1============ 触摸响应时间是系统规定的,根据屏幕的灵敏度等规定的,不同机型的触摸响应时间是不同的.一般20毫秒左右吧 ============解决方案2============ 触摸响应的时间无法自定义,不过在触摸响应函数中的响应操作你可以控制啊,你可以在这里作延迟.

MFC消息响应机制分析

---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析,可以帮助程序开发人员对MFC的消息映射机制有一个比较透彻的了解. ---- 关键词:面向对象 消息映射 MFC 程序设计 一.引言---- VC++的MFC类库实际上是Windows下C++编程的一套最为流行的类库.MFC的框架结构大大方便了程序员的编程工作,但是为了更加有效.灵活的使用MFC编程

Android的事件响应机制

1:View的事件响应机制(控件:如TextView,ImageView,Button等) 在执行onTouchListener方法时候,(view这里代表为控件) view.setOnTouchListener (new OnTouchListener() { @Override public boolean onTouch( View v, MotionEvent event) { return false ; } }); 事件分发的时候会执行publicboolean dispatchTo

Android MotionEvent事件响应机制

在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action_move),抬起(action_up).各种响应归根结底都是基于View以及ViewGroup的,这两者中响应的方法分别有: View.java中: publi boolean dispatchTouchEvent(MotionEvent event) public boolean onTouch

Android中TouchEvent触摸事件机制

当我们的手指在Android屏幕上点击或滑动时,就会触发触摸事件TouchEvent.在App中ViewGroup和View存在多级嵌套,在最外层的是Activity,最内层的View,介于Activity与View之间的是一些ViewGroup.本文为了简化讨论,我们假设一个Activity中只有一个ViewGroup,这个ViewGroup中只有一个View.当我们用手指触摸到View的UI时,就会产生触摸事件TouchEvent,总的过程如下图所示: 首先是最外层的Activity接收到该

cocos2dx触摸响应

Layer其实继承了触控的接口. 所以只需要重写一些函数即可. 在helloword类中重写: virtual bool init(); /** Callback function for touch began. * * @param touch Touch information. * @param unused_event Event information. * @return if return false, onTouchMoved, onTouchEnded, onTouchCan