如何监听各个GUI控件的交互事件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何监听各个GUI控件的交互事件相关的知识,希望对你有一定的参考价值。
参考技术A 所有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));
GUI框架
既然我们上文中提到了当前最主流的交互方式就是图形化交互,我们就来看看图形用户界面的基本结构。现在普遍的系统上都会有一个应用程序框架,而这类框架都会提供一个GUI(Graphics User Interface),有了GUI,作为应用程序的普通开发者就不需要去关注如何去监听用户的事件,如何去调度各个程序之间的窗口(窗口直接的覆盖,隐藏,激活,调度等),窗口的绘制,图形的绘制,等等。
一个典型的GUI框架要处理:
1.事件的接收和分发;
2.窗口的调度;
3.图形的绘制 。
所以一个典型的GUI框架需要包括:事件管理器,窗口管理器;图形设备接口(GDI)。基本结构如上图:
而一般的数据流图如下:
可见,在我们的应用程序之下,GUI框架已经做了很多底层的工作,而掌握GUI的运行原则和规律也是很有必要的。目前有很多的GUI框架,
比如symbian系统上的S60UI框架,windows的MFC框架,android的gui框架,QT框架。
GUI里有一个最重要的概念就是“窗口”,当然可能各个系统对此的称呼不同。但它们都具有这些功能:可以处理消息,有一个可显示矩形区域,可以绘制重绘(所以窗口也是个绘图设备),有的可以改变尺寸大小。在GUI的世界里,可以把一切都看成是窗口,桌面也是窗口(根窗口)。
https://blog.csdn.net/guanjungao/article/details/45789357
以上是关于如何监听各个GUI控件的交互事件的主要内容,如果未能解决你的问题,请参考以下文章
unity3D小小白之GUI控件(ButtonTextfieldSlider)(还在写)
求助:android两个及以上控件点击事件同时监听响应如何实现