Events 事件与监听
稳定性: 稳定
events 模块提供了监听手机通知、按键、触摸的接口。您可以用他配合自动操作函数完成自动化工作。
events 本身是一个EventEmiiter, 但内置了一些事件、包括按键事件、通知事件、Toast 事件等。
需要注意的是,事件的处理是单线程的,并且仍然在原线程执行,如果脚本主体或者其他事件处理中有耗时操作、轮询等,则事件将无法得到及时处理(会进入事件队列等待脚本主体或其他事件处理完成才执行)。例如:
auto();
events.observeNotification();
events.on("toast", function (t) {
//这段代码将得不到执行
log(t);
});
while (true) {
//死循环
}
events.emitter()
返回一个新的EventEmitter。这个 EventEmitter 没有内置任何事件。
events.observeKey()
启用按键监听,例如音量键、Home 键。按键监听使用无障碍服务实现,如果无障碍服务未启用会抛出异常并提示开启。
只有这个函数成功执行后, onKeyDown
, onKeyUp
等按键事件的监听才有效。
该函数在安卓 4.3 以上才能使用。
events.onKeyDown(keyName, listener)
keyName
{string} 要监听的按键名称listener
{Function} 按键监听器。参数为一个KeyEvent。
注册一个按键监听函数,当有 keyName 对应的按键被按下会调用该函数。可用的按键名称参见Keys。
例如:
//启用按键监听
events.observeKey();
//监听音量上键按下
events.onKeyDown("volume_up", function (event) {
toast("音量上键被按下了");
});
//监听菜单键按下
events.onKeyDown("menu", function (event) {
toast("菜单键被按下了");
exit();
});
events.onKeyUp(keyName, listener)
keyName
{string} 要监听的按键名称listener
{Function} 按键监听器。参数为一个KeyEvent。
注册一个按键监听函数,当有 keyName 对应的按键弹起会调用该函数。可用的按键名称参见Keys。
一次完整的按键动作包括了按键按下和弹起。按下事件会在手指按下一个按键的"瞬间"触发, 弹起事件则在手指放开这个按键时触发。
例如:
//启用按键监听
events.observeKey();
//监听音量下键弹起
events.onKeyDown("volume_down", function (event) {
toast("音量下键弹起");
});
//监听Home键弹起
events.onKeyDown("home", function (event) {
toast("Home键弹起");
exit();
});
events.onceKeyDown(keyName, listener)
keyName
{string} 要监听的按键名称listener
{Function} 按键监听器。参数为一个KeyEvent
注册一个按键监听函数,当有 keyName 对应的按键被按下时会调用该函数,之后会注销该按键监听器。
也就是 listener 只有在 onceKeyDown 调用后的第一次按键事件被调用一次。
events.onceKeyUp(keyName, listener)
keyName
{string} 要监听的按键名称listener
{Function} 按键监听器。参数为一个KeyEvent
注册一个按键监听函数,当有 keyName 对应的按键弹起时会调用该函数,之后会注销该按键监听器。
也就是 listener 只有在 onceKeyUp 调用后的第一次按键事件被调用一次。
events.removeAllKeyDownListeners(keyName)
keyName
{string} 按键名称
删除该按键的 KeyDown(按下)事件的所有监听。
events.removeAllKeyUpListeners(keyName)
keyName
{string} 按键名称
删除该按键的 KeyUp(弹起)事件的所有监听。
events.setKeyInterceptionEnabled([key, ]enabled)
enabled
{boolean}key
{string} 要屏蔽的按键
设置按键屏蔽是否启用。所谓按键屏蔽指的是,屏蔽原有按键的功能,例如使得音量键不再能调节音量,但此时仍然能通过按键事件监听按键。
如果不加参数 key 则会屏蔽所有按键。
例如,调用events.setKeyInterceptionEnabled(true)
会使系统的音量、Home、返回等键不再具有调节音量、回到主页、返回的作用,但此时仍然能通过按键事件监听按键。
该函数通常于按键监听结合,例如想监听音量键并使音量键按下时不弹出音量调节框则为:
events.setKeyInterceptionEnabled("volume_up", true);
events.observeKey();
events.onKeyDown("volume_up", () => {
log("音量上键被按下");
});
只要有一个脚本屏蔽了某个按键,该按键便会被屏蔽;当脚本退出时,会自动解除所有按键屏蔽。
events.observeTouch()
启用屏幕触摸监听。(需要 root 权限)
只有这个函数被成功执行后, 触摸事件的监听才有效。
没有 root 权限调用该函数则什么也不会发生。
events.setTouchEventTimeout(timeout)
timeout
{number} 两个触摸事件的最小间隔。单位毫秒。默认为 10 毫秒。如果 number 小于 0,视为 0 处理。
设置两个触摸事件分发的最小时间间隔。
例如间隔为 10 毫秒的话,前一个触摸事件发生并被注册的监听器处理后,至少要过 10 毫秒才能分发和处理下一个触摸事件,这 10 毫秒之间的触摸将会被忽略。
建议在满足需要的情况下尽量提高这个间隔。一个简单滑动动作可能会连续触发上百个触摸 事件,如果 timeout 设置过低可能造成事件拥堵。强烈建议不要设置 timeout 为 0。
events.getTouchEventTimeout()
返回触摸事件的最小时间间隔。
events.onTouch(listener)
listener
{Function} 参数为Point的函数
注册一个触摸监听函数。相当于on("touch", listener)
。
例如:
//启用触摸监听
events.observeTouch();
//注册触摸监听器
events.onTouch(function (p) {
//触摸事件发生时, 打印出触摸的点的坐标
log(p.x + ", " + p.y);
});
events.removeAllTouchListeners()
删除所有事件监听函数。
事件: 'key'
keyCode
{number} 键值event
{KeyEvent} 事件
当有按键被按下或弹起时会触发该事件。 例如:
auto();
events.observeKey();
events.on("key", function (keyCode, event) {
//处理按键事件
});
其中监听器的参数 KeyCode 包括:
keys.home
主页键keys.back
返回键keys.menu
菜单键keys.volume_up
音量上键keys.volume_down
音量下键
例如:
auto();
events.observeKey();
events.on("key", function (keyCode, event) {
if (keyCode == keys.menu && event.getAction() == event.ACTION_UP) {
toast("菜单键按下");
}
});