addeventlistener接口(addeventlistener)
如何监听各个GUI控件的交互事件
所有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_castWidget
*(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));
window.addeventlistener怎么用
以下是用法:
1、针对 window 对象触发的事件(应用到 body 标签):
2、Form 事件
由 HTML 表单内的动作触发的事件(应用到几乎所有 HTML 元素,但最常用在 form 元素中):
对计算机软件的维护主要有以下几点:
(1)对所有的系统软件要做备份。当遇到异常情况或某种偶然原因,可能会破坏系统软件,此时就需要重新安装软件系统,如果没有备份的系统软件,将使计算机难以恢复工作。
(2)对重要的应用程序和数据也应该做备份。
(3)经常注意清理磁盘上无用的文件,以有效地利用磁盘空间。
(4)避免进行非法的软件复制。
(5)经常检测,防止计算机传染上病毒。
(6)为保证计算机正常工作,在必要时利用软件工具对系统区进行保护。
总之,计算机的使用是与维护分不开的,既要注意硬件的维护,又要注意软件的维护。
addEventListener 为什么要加(false, 0, true);
它的五个参数分别是addEventlistener(事件类型,监听函数,是否打开捕获阶段,监听器优先级别,是否打开弱监听) 。
useCapture:Boolean (default = false) — 确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。如果 useCapture 为 false,则侦听器只在目标或冒泡阶段处理事件。要在所有三个阶段都侦听事件,请调用 addEventListener 两次:一次将 useCapture 设置为 true,一次将 useCapture 设置为 false. priority:int (default = 0) — 事件侦听器的优先级。优先级由一个带符号的 32 位整数指定。数字越大,优先级越高。优先级为 n 的所有侦听器会在优先级为 n -1 的侦听器之前得到处理。如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为 0。 useWeakReference:Boolean (default = false) — 确定对侦听器的引用是强引用,还是弱引用。强引用(默认值)可防止您的侦听器被当作垃圾回收。弱引用则没有此作用。类级别成员函数不属于垃圾回 收的对象,因此可以对类级别成员函数将 useWeakReference 设置为 true 而不会使它们受垃圾回收的影响。如果对作为嵌套内部函数的侦听器将 useWeakReference 设置为 true,则该函数将作为垃圾回收并且不再是永久函数。如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持 永久。
js addeventlistener 怎么传参数
addEventListener的使用方式:?
target.addEventListener(type,?listener,?useCapture);?
target:?文档节点、document、window?或?XMLHttpRequest。?
type:?字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。?
listener?:实现了?EventListener?接口或者是?JavaScript?中的函数。?
useCapture?:是否使用捕捉,一般用?false?。
????例如:document.getElementById("testText").addEventListener("keydown",?function?(event)?{?alert(event.keyCode);?},?false);
什么是接口回调方式 有具体例子吗
首先理解回调的含义,回调就是当主程序需要的时候(或者到预定义状态值)调用的接口实现类。接口实际上不能被直接调用的,我们凡是能调用的一定不是接口或者抽象类。
接口回调的很多应用场景是出现在以接口类型为参数的情况下,以匿名内部类的方式传入而达到。
例如,假设有一个Java的API方法叫作:(其中的ClickEvent就是一个接口)
public void addEventListener(ClickEvent evt);
那么,你在调用的时候就可以这样:
addEventListener(new ClickEvent(){
//在这里实现接口中的方法
});
当发生某事件是,API的addEventListener方法就会被组件调用,从而你的完成的匿名内部类代码就会被组件执行。
仔细想想,其实很不是那么困难的。
addEventListener之handleEvent
addEventListener()
方法是将指定的事件监听器注册到目标对象上,当该对象触发指定的事件时,指定的回调函数就会被执行。
其中listener:当指定的事件类型发生时被通知到的一个对象。该参数必须是实现EventListener接口的一个对象或函数。即,第二个参数除了可以传入函数外,还可以传入对象。
也就是说事件会自动在传入对象中寻找handleEvent方法。
这样在 element 触发event事件后,调用的是handleEvent 方法,且其中的 this 是指实现EventListener接口的对象,这里指向obj对象。而普通的函数中的this 指向事件源:
这样就可以动态切换绑定事件的处理函数,而不需要remove之前的事件。
这样可以把不同事件的处理逻辑放到一起,根据事件类型区分即可,而不用为每个事件类型定义不同的处理函数了。因为处理逻辑都在同一对象中,也使程序更加“内聚”了。
DOM2标准不支持iE6,7,8