cocos中Widget 的用法

摘自百度:
http://zhidao.baidu.com/link?url=aIjF3FRMMHaAP67BDVhw8uroKelKb3KjYuybQq4XJnIT9x2Sjxm8Uyg4VBuxSiYD0awKfpP259iPcCM13GMOkIDlw15Rm0FVK8Pq9P_8T_C
 
 
所有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接口:

  1
  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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值