前端之家收集整理的这篇文章主要介绍了
Cocos教程 监听各个GUI控件的交互事件。,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
现在的Stu
dio支持同时创建widget和非Widget类型的节点。
但是——基于偷懒的原则,这里只介绍widget类型及继承于Wiget类型控件的事件(即GUI相关控件)。
------------------------------------------------------------------------------------------------------------------------------------------
@H_
403_25@
设置监听某个控件自有事件的流程
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:
break;
default:
break;
}
}
3.设置监听:
@H_
403_25@
ER5gmmVP@p
yourTextField->addEventListener(CC_CALLBACK_2(yourClass::textFieldEvent,this));
@H_
403_25@
\]2]/=2tLd ------------------------------------------------------------------------------------------------------------------------------------------
OwH81# 各个控件支持的自有事件(枚举值):(截止于3.3RC0) .<x&IJ / 输入框(ui::TextFiled)
enum class EventType
{
ATTACH_WITH_IME,//获得输入焦点
DETACH_WITH_IME,//失去输入焦点
INSERT_TEXT,//输入了文本
};
enum class ui::Check
Box::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//点中了某个项并抬起(没有发生滑动)
};
enum class EventType
{
TURNING//滚动到了页
};
-------------------------------------------------------------------------------------------------------------------------------------------------------
cDFO;Dr
@H_
403_25@
通用触摸事件:
1 u| wMO 其他所有Widget类型的节点都
支持addTouchEventListener和addClickEventListener这两个接口。可以通过些接口来接收触摸事件。
aWWU4xe addTouchEventListener的使用步骤如下:(c++下)
-QM: q 1.同样的准备好你的widget节点,在编辑器中开启交互(或在
代码中setTouchEnabled(true))。
aJ-K?xQ 2.定义一个
函数,形式如下
k.vBj~xU
复制代码
-
- 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");
- }
- }
|
@H_876_301@
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时回调。
-------------------------------------------------------------------------------------------------------------------------------------------------------
@H_403_25@关于点击没响应的可能:
ftvG\Tf 1.没开启交互。
juka0/ 2.控件被挡住。
w+#C-&z (
代码纯手打,有啥问题烦请指出啊)
<lw` 3aa( -------------------------------------------------------------------------------------------------------------------------------------------------------
(@<lRA ^
@H_
403_25@
其他细节
#{?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 现在的Stu
dio支持同时创建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
复制代码
-
- {
- 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);
- }
|
@H_876_301@
--------------
无法addTouchEventListener
图片:屏幕快照 2014-07-22 下午4.32.05.png
图片:屏幕快照 2014-07-22 下午4.32.23.png
啊,找到原因了。。。
Yzih-$g TouchEventType有新旧两种。。。。
otJHcGv 用Widget::TouchEventType这种,而不是旧的。。。。
voidWidget::propagateTouchEvent(cocos2d::ui::Widget::TouchEventType event,cocos2d::ui::Widget *sender,cocos2d::Touch *touch)<span style="font-family: arial; font-size: 12px;"></span>