如何监听各个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)(还在写)

急急急!!!matlab gui界面设计

Java实验5 GUI编程

求助:android两个及以上控件点击事件同时监听响应如何实现

跟着Innost理解下Android控件(ViewRoot)系统

android 基础UI控件学习总结