加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【cocostudio】如何监听各个GUI控件的交互事件

发布时间:2020-12-14 19:39:02 所属栏目:百科 来源:网络整理
导读:http://cn.cocos2d-x.org/tutorial/show?id=1947 在 之前的文章 中我们介绍到新版Cocos Studio支持同时创建widget和非Widget类型的节点。本文主要介绍widget类型的事件。 所有Widget类型的节点都支持addTouchEventListener和addClickEventListener这两个接口

http://cn.cocos2d-x.org/tutorial/show?id=1947

之前的文章中我们介绍到新版Cocos Studio支持同时创建widget和非Widget类型的节点。本文主要介绍widget类型的事件。


所有Widget类型的节点都支持addTouchEventListener和addClickEventListener这两个接口。可以通过些接口来接收触摸事件。

addTouchEventListener的使用步骤如下(C++):

1)准备好你的widget节点,在编辑器中开启交互(或在代码中setTouchEnabled(true))。

2)定义一个函数,形式如下

void ACuteClass::onTouchEvent(cocos2d::Ref *ref,Widget::TouchEventType touchType)
{
  switch(touchType)
  {
  case Widget::TouchEventType::BEGAN:
    CCLOG("on began");
    break;
  case Widget::TouchEventType::MOVED:
    CCLOG("on moved");
    break;
  case Widget::TouchEventType::ENDED:
    CCLOG("on ended");
    break;
  case Widget::TouchEventType::CANCELED:
    CCLOG("on canceled");
    break;
  default:
    CCLOG("impossible");
  }
}

3)把这个函数传递给addTouchEventListener接口:

your_widget->addTouchEventListener(CC_CALLBACK_2(ACuteClass::onTouchEvent,this));//CC_CALLBACK_2照着写,表示有两个参数的回调。

ok搞定。

addTouchEventListener的使用方法一样,不同的地方是:回调函数onTouchEvent在一次触摸中只回调一次,触发ENDED时回调。

关于点击没响应的可能:

  • 没开启交互。

  • 控件被挡住。

其他细节

1. 如何获取触摸事件的坐标

用下面这几个接口:

  • getTouchBeganPosition

  • getTouchMovePosition

  • getTouchEndPosition

看名字就知道获取的是什么了吧。


2. 关于ScrollView在某些情况下点到子控件不能拖动的问题

现在的Studio支持同时创建widget和非Widget类型的节点。这样会有一个问题。

Widget类型接受到触摸事件时,会把这些事件向上层传递,但是在遇到非Widget节点时会停下来。这会导致点击ScrollView等View类中的控件(两者之间有node)拖动时,拖动失败。

解决方案:

  • 设置View中的控件的SwalloTouches属性为false。使控件不截断touch事件

  • 改下源码:将如下代码替换掉Widget中同名函数。

void Widget::propagateTouchEvent(cocos2d::ui::Widget::TouchEventType event,cocos2d::ui::Widget *sender,cocos2d::Touch *touch)
{
  Widget *widgetParent = nullptr;
  for(Node *p = this;widgetParent == nullptr;)
  {
    p = p->getParent();
    if(p)
    {
      widgetParent = dynamic_cast<Widget *>(p);
    }
    else
    {
      return;
    }
  }
  widgetParent->interceptTouchEvent(event,sender,touch);
}


ui::TextField

类似于addTouchEventListener

1.设置交互或者setTouchEnabled(true)

2.编写一个监听函数:

void yourClass::textFieldEvent(Ref *pSender,TextField::EventType type)
{
  switch (type)
  {
    case TextField::EventType::ATTACH_WITH_IME:
      CCLOG("获得输入焦点");
      break;
    case TextField::EventType::DETACH_WITH_IME:
      CCLOG("获得输入焦点");
      break;
    case TextField::EventType::INSERT_TEXT:
      CCLOG("输入了文本");
      break;
    case TextField::EventType::DELETE_BACKWARD:
      CCLOG("获得输入焦点");
      break;
    default:
      break;
  }
}

3.设置监听:

yourTextField->addEventListener(CC_CALLBACK_2(yourClass::textFieldEvent,this));


Cocos引擎中文官网现面向广大Cocos引擎相关开发者征集优秀教程(Cocos2d-x/Cocos2d-JS/Quick/Cocos Studio),欢迎给位童鞋踊跃投稿!来稿请发送至:support@cocos.org。


来源网址:http://www.cocoachina.com/bbs/read.php?tid=270804&page=1&toread=1#tpc

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读