Flex: обнаружение бездействия пользователя?

Как я могу узнать, когда пользователь бездействует, скажем, 5 минут в моем приложении Flex?

Когда я говорю «бездействует», я имею в виду, что пользователь вообще не взаимодействовал с приложением.

Спасибо!!


person JD Isaacks    schedule 04.02.2010    source источник


Ответы (5)


См. Также событие idle в SystemManager . Этот подход работает для AIR или Flash Player.

application.systemManager.addEventListener(FlexEvent.IDLE, onIdle);

Вы можете получить время простоя (неподдерживаемым способом), используя

SystemManager.mx_internal::idleCounter
person Michael Brewer-Davis    schedule 05.02.2010

Поскольку это приложение AIR, я могу просто прослушивать событие USER_IDLE в NativeApplication.

//Set seconds for idle
this.nativeApplication.idleThreshold = 5; 
//listen for user idle
this.nativeApplication.addEventListener(Event.USER_IDLE,lock); 
person JD Isaacks    schedule 05.02.2010

Создайте таймер, который вы сбрасываете каждый раз, когда вы фиксируете пользовательское событие на уровне приложения.

Если таймер закончился, вы знаете, что пользователь бездействует в течение установленного времени.

// 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();
}
person CookieOfFortune    schedule 04.02.2010
comment
Спасибо, у меня вопрос: если это приложение AIR, будет ли оно захватывать события из других окон? Спасибо! - person JD Isaacks; 05.02.2010
comment
Кроме того, всякий раз, когда пользователь взаимодействует с модальным всплывающим окном над приложением, кажется, что приложение не получает события? есть исправление? - person JD Isaacks; 05.02.2010

Вы можете получить тайм-аут, используя следующий код:

 <?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>
person Saurabh    schedule 12.01.2012

@ Майкл Брюэр-Дэвис

systemManager.addEventListener(FlexEvent.IDLE, onIdle) отлично работает с событиями мыши.

Что насчет событий клавиатуры. Вы должны сфокусироваться на каком-то элементе, прежде чем systemManager прослушивает события клавиатуры.

Частичное решение: в событии applicationComplete я добавил строку ниже

   stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);

Теперь прослушиваются события клавиатуры.

Недостаток: работает только после того, как приложение было нажат хотя бы один раз. Тогда после работает нормально

Есть ли способ заставить приложение прослушивать события клавиатуры, не нажимая один раз. Некоторые предлагали добавить stage.focus = this. Тоже не сработало. (Все равно нужен был клик)

person user418836    schedule 12.04.2012