#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 получает фокус, я проверяю, считается ли кнопка мыши нажатой. Поскольку кнопка мыши не может быть нажата внутри флэш-клиента до того, как флэш-клиент получит фокус, я могу с уверенностью предположить, что она должна быть включена, и вызвать соответствующий код.