Как мне узнать, нажата ли кнопка мыши?

#actionscript-3 #actionscript

#actionscript-3 #actionscript

Вопрос:

Есть ли какой-либо способ узнать в любое время, нажата ли кнопка мыши?

У меня есть некоторый код, который выполняется при нажатой кнопке мыши, но если я переключусь с флэш-клиента при нажатой кнопке мыши, то прослушиватели мыши вверх никогда не вызываются, поэтому я хотел бы учесть эту ситуацию, проверив, нажата ли кнопка мыши.

В идеале я хотел бы что-то вроде:

 if (Mouse.isDown) {
    trace("down");
} else {
    trace("up");
}
  

Ответ №1:

вам нужно проверить MouseEvent::buttonDown свойство в MouseEvent.MOUSE_MOVE обработчике, чтобы переключить какой-либо Boolean флаг
upd
код:

 package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent; 
    /**
     * ...
     * @author www0z0k
     */
    [SWF (width="320", height="240", frameRate="24")]
    public class Main extends Sprite {
        private var _isDown:Boolean = false;
        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            color = 0;
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
        }

        private function onMove(e:MouseEvent):void {
            color = e.buttonDown ? 0xffff00 : 0x0000ff;
        }

        public function set color(value:int):void {
            graphics.clear();
            graphics.beginFill(value);
            graphics.drawRect(0, 0, 320, 240);
            graphics.endFill();
        }       
    }   
}
  

результат — я нажимаю кнопку, перемещаю указатель за пределы Firefox, снова нажимаю кнопку, нажимаю на другое окно приложения, затем alt-tab обратно в Firefox и перемещаю мышь; в этот момент мой swf распознает, что кнопка мыши отпущена

upd 2
это работает так, как предполагается в Firefox 3.6.10 и как описано в вопросе в Firefox 7.0.1

Комментарии:

1. после того, как указатель мыши и фокус возвращаются к swf (и поэтому MOUSE_MOVE запускается), вы получили неправильное buttonDown значение в этом обработчике событий?

2. Да, очевидно, Flash все еще думает, что кнопка мыши нажата. Если флэш-клиент теряет фокус, когда нажата кнопка мыши, он никогда не узнает, что в то же время он был выпущен, поэтому, когда он снова получает фокус, он думает, что он все еще отключен. Это происходит не везде, но я всегда могу воспроизвести это в Firefox, последнем клиенте для разработчиков 11, Windows 7.

3. или вы сохраняете предыдущий MouseEvent экземпляр и проверяете его buttonDown свойство? если да — это не должно работать

4. звучит интересно, я попытаюсь воспроизвести 😉

5. Я попытался добавить прослушиватель сцены для MouseEvent.MOUSE_MOVE , и в функции, обрабатывающей событие, я проверяю event.buttonDown . Это происходит true после возврата фокуса, даже если кнопка на самом деле поднята.

Ответ №2:

В итоге я добавил Event.ACTIVATE прослушиватель. Всякий раз, когда Flash получает фокус, я проверяю, считается ли кнопка мыши нажатой. Поскольку кнопка мыши не может быть нажата внутри флэш-клиента до того, как флэш-клиент получит фокус, я могу с уверенностью предположить, что она должна быть включена, и вызвать соответствующий код.