Cocos教程 监听各个GUI控件的交互事件

 
 
现在的Studio支持同时创建widget和非Widget类型的节点。
但是——基于偷懒的原则,这里只介绍widget类型及继承于Wiget类型控件的事件(即GUI相关控件)。
------------------------------------------------------------------------------------------------------------------------------------------
设置监听某个控件自有事件的流程 cocos2d-x3.x开始,支持自有事件的控件都提供了addEventListener接口来设置各自的监听函数,并使用functional来接收监听函数 ^=RffrlZU 以下以TextFiled为例说明: ?fUlgQ }N 1.编辑器中设置交互或者程序中调用setTouchEnabled(true) jv%kOovj 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.设置监听: ER5gmmVP@p yourTextField->addEventListener(CC_CALLBACK_2(yourClass::textFieldEvent,this)); \]2]/=2tLd ------------------------------------------------------------------------------------------------------------------------------------------ OwH81#  各个控件支持的自有事件(枚举值):(截止于3.3RC0) .<x&IJ / 输入框(ui::TextFiled)
enum class EventType
{
ATTACH_WITH_IME,//获得输入焦点
DETACH_WITH_IME,//失去输入焦点
INSERT_TEXT,//输入了文本
DELETE_BACKWARD,//删除文字
};
复选框(ui::CheckBox
enum class ui::CheckBox::EventType
{
SELECTED,//勾选了复选框
UNSELECTED//取消勾选了复选框
};
滑动条(ui::Slider)
enum class ui::Slider::EventType
{
ON_PERCENTAGE_CHANGED//百分比改变。
};
滚动层(ui::ScrollView)
enum class ui::ScrollView:: EventType
{
SCROLL_TO_TOP,//滚动到顶时触发。SCROLL_TO_BottOM,//滚动到底时触发SCROLL_TO_LEFT,//滚动到左边缘时触发SCROLL_TO_RIGHT,//滚动到右边缘时触发SCROLLING,//滚动时触发BOUNCE_TOP,//顶部回弹效果达到极限时触发BOUNCE_BottOM,//底部回弹效果达到极限时触发BOUNCE_LEFT,//左部回弹效果达到极限时触发BOUNCE_RIGHT//右部回弹效果达到极限时触发};
列表容器(ui::ListView)
enum class ui::ListView::EventType
{
ON_SELECTED_ITEM_START,//点中某个项
ON_SELECTED_ITEM_END//点中了某个项并抬起(没有发生滑动)
};
翻页容器(ui::PageView)
enum class EventType
{
TURNING//滚动到了页
};
------------------------------------------------------------------------------------------------------------------------------------------------------- cDFO;Dr 通用触摸事件: 1 u| wMO 其他所有Widget类型的节点都支持addTouchEventListener和addClickEventListener这两个接口。可以通过些接口来接收触摸事件。 aWWU4xe addTouchEventListener的使用步骤如下:(c++下) -QM: q 1.同样的准备好你的widget节点,在编辑器中开启交互(或在代码中setTouchEnabled(true))。 aJ-K?xQ 2.定义一个函数,形式如下 k.vBj~xU
复制代码
  1. ?
    1
  2. void ACuteClass::onTouchEvent(cocos2d::Ref *ref,Widget::TouchEventType touchType)
  3. {
  4. switch(touchType)
  5. {
  6. case Widget::TouchEventType::BEGAN:
  7. cclOG("on began");
  8. break;
  9. case Widget::TouchEventType::MOVED:
  10. cclOG("on moved");
  11. break;
  12. case Widget::TouchEventType::ENDED:
  13. cclOG("on ended");
  14. break;
  15. case Widget::TouchEventType::CANCELED:
  16. cclOG("on canceled");
  17. break;
  18. default:
  19. cclOG("impossible");
  20. }
  21. }
J'SZ wVicyiY] 3.把这个函数传递给addTouchEventListener接口: 4'`{H@]tb your_widget->addTouchEventListener(CC_CALLBACK_2(ACuteClass::onTouchEvent,this));//CC_CALLBACK_2照着写,表示有两个参数的回调。 jkiFLtB@V aE&,]'6 addTouchEventListener的使用方法一样,不同的地方是:回调函数onTouchEvent在一次触摸中只回调一次,触发ENDED时回调。
-------------------------------------------------------------------------------------------------------------------------------------------------------
关于点击没响应的可能: ftvG\Tf 1.没开启交互。 juka0/ 2.控件被挡住。 w+#C-&z 代码纯手打,有啥问题烦请指出啊) <lw` 3aa( ------------------------------------------------------------------------------------------------------------------------------------------------------- (@<lRA ^ 其他细节 #{?PbBE} 1.如何获取触摸事件的坐标: %Y<|;0v 用下面这几个接口: hxVKV?Fl getTouchBeganPosition n>+mL"hs getTouchMovePosition Zhh2v>QOy getTouchEndPosition s>;v!^N?u m?pstuUK( 2.关于ScrollView在某些情况下点到子控件不能拖动的问题 L+Xc-uv["p 现在的Studio支持同时创建widget和非Widget类型的节点。这样会有一个问题。 < Z{HX[y Widget类型接受到触摸事件时,会把这些事件向上层传递,但是在遇到非Widget节点时会停下来。这会导致点击ScrollView等View类中的控件(两者之间有node)拖动时,拖动失败。 4wa`<H&S5 解决方案: xO^:_8=&: 1.设置View中的控件的Swallotouches属性为false。使控件不截断touch事件 l6YtEHNG 2.或者改下源码:将如下代码替换掉Widget中同名函数 t2F _uCr
复制代码
  1. ?
    1
  2. {
  3. Widget *widgetParent = nullptr;
  4. for(Node *p = this;widgetParent == nullptr;)
  5. {
  6. p = p->getParent();
  7. if(p)
  8. {
  9. widgetParent = dynamic_cast(p);
  10. }
  11. else
  12. {
  13. return;
  14. }
  15. }
  16. widgetParent->interceptTouchEvent(event,sender,touch);
  17. }
    ?
    1
--------------
无法addTouchEventListener
图片:屏幕快照 2014-07-22 下午4.32.05.png
图片:屏幕快照 2014-07-22 下午4.32.23.png
啊,找到原因了。。。 Yzih-$g TouchEventType有新旧两种。。。。 otJHcGv 用Widget::TouchEventType这种,而不是旧的。。。。
帮我看看是不是跟你是一样的问题 应该怎么解决
图片:捕获.PNG
如上。。。。。。
图片:捕获2.PNG
voidWidget::propagatetouchEvent(cocos2d::ui::Widget::TouchEventType event,cocos2d::ui::Widget *sender,cocos2d::Touch *touch)<span style="font-family: arial; font-size: 12px;"></span>

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...