Гибкий:обнаружение пользователя в режиме ожидания?
-
18-09-2019 - |
Вопрос
Как я могу определить, что пользователь бездействовал в моем приложении Flex в течение, скажем, 5 минут?
Когда я говорю «бездействие», я имею в виду, что пользователь вообще не взаимодействовал с приложением.
Спасибо!!
Решение
См. также idle
событие в SystemManager
.Этот подход работает для AIR или Flash Player.
application.systemManager.addEventListener(FlexEvent.IDLE, onIdle);
Вы можете получить время простоя (неподдерживаемым способом), используя
SystemManager.mx_internal::idleCounter
Другие советы
Поскольку это приложение AIR, я могу просто прослушивать событие USER_IDLE в NativeApplication.
//Set seconds for idle
this.nativeApplication.idleThreshold = 5;
//listen for user idle
this.nativeApplication.addEventListener(Event.USER_IDLE,lock);
Создайте таймер, который вы сбрасываете каждый раз, когда фиксируете пользовательское событие на уровне приложения.
Если таймер закончился, вы знаете, что пользователь бездействовал в течение заданного периода времени.
// I am capturing only mouseMove and keyDown. That _should_ be enough to handle most user interactions.
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" mouseMove="onUserEvent" keyDown="onUserEvent">
...
private function onUserEvent(event:Event):void
{
timer.reset();
}
Вы можете получить тайм-аут, используя следующий код:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600"
initialize="init(event)">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.core.mx_internal;
import mx.events.FlexEvent;
protected function init(event:FlexEvent):void
{
systemManager.addEventListener(FlexEvent.IDLE, handleApplicationIdle);
}
private function handleApplicationIdle(event:FlexEvent):void
{
if(event.currentTarget.mx_internal::idleCounter == 60){
Alert.show("Time out happened");
}
}
]]>
</fx:Script>
</s:Application>
@Майкл Брюэр-Дэвис
systemManager.addEventListener(FlexEvent.IDLE, onIdle) отлично работает для событий мыши.
А как насчет событий клавиатуры.Вам нужно сосредоточиться на каком-то элементе, прежде чем systemManager прослушает события клавиатуры.
Частичное решение:В событие ApplicationComplete я добавил ниже Line Stage.AddeventListener (keyboardevent.key_down, handekeydown);Теперь события клавиатуры прослушиваются.
Недостаток: Работает только после того, как приложение нажато хотя бы один раз.Потом после работает нормально
Есть ли способ заставить приложение прослушивать события клавиатуры без необходимости однократного нажатия.Некоторые предлагали добавить «stage.focus = this».Тоже не получилось.(все равно клик нужен был)