嵌套布局怎么监听控件事件
答案:2 悬赏:40
解决时间 2021-02-11 14:49
- 提问者网友:浪子生来ˇ性放荡²↘
- 2021-02-11 02:33
嵌套布局怎么监听控件事件
最佳答案
- 二级知识专家网友:颜值超标
- 2021-02-11 02:56
所有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(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));
全部回答
- 1楼网友:孤伤未赏
- 2021-02-11 04:22
任务占坑
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯