ActionScript MouseEvent.clone() кажется неработающим?
-
05-09-2019 - |
Вопрос
Я столкнулся с проблемой при попытке переотправка события мыши в ActionScript 3, к чему я, признаться, немного недоверчив.Я сузил это до MouseEvent.clone()
метод оказался, ну, совершенно сломанным.Следующий обработчик событий:
private function handleMouseMove( evt : MouseEvent ) : void
{
trace("mousemove", evt.stageX, evt.stageY);
var newEvt : MouseEvent = evt.clone() as MouseEvent;
trace("mousemoveclone", newEvt.stageX, newEvt.stageY);
}
Результат: до бесконечности:
mousemove 167 206
mousemoveclone 0 0
Это соответствует тому, что получал код, на который я перенаправлял MouseEvent, отсюда и моя гипотеза о неработающей функции клонирования.
Это прямо противоречит тому, что должно произойти в связанной документации, если только я что-то не пропустил.Я совершенно не понимаю, что я сделал (или не сделал), что могло вызвать такое поведение.Неужели ребята из AS3 забыли прочитать собственные документы по Event.clone()
?
Я могу обойти это, используя вместо этого функциональные объекты для моего конкретного случая использования, но я бы предпочел не делать этого.Есть идеи?
Редактировать: Члены localX и localY, кажется, клонируются правильно, что еще больше запутывает меня в том, что здесь происходит.
Решение
Это известная ошибка.Вы можете увидеть отчет об ошибке здесь: http://bugs.adobe.com/jira/browse/FP-343
Однако все остальное должно быть клонировано.Вы всегда можете просто назначить stageX и stageY вручную, пока ошибка не будет исправлена.
Другие советы
Я понимаю, что эта тема неактивна уже 7 месяцев, но хочу немного обновить ее — она все еще активна в FP10 и Flex4.Это также произойдет, если вы повторно отправите событие.то есть:
private function mouseListener( e:MouseEvent ):void
{
dispatchEvent( e );
}
этот вызов sendEvent() кажется эквивалентом clone(), поэтому для stageX и stageY установлено значение 0.
Это довольно старый вопрос, но он возник, когда я искал решение в Google, и то, что здесь, просто недостаточно полно.
Причина, по которой это не было «исправлено», заключается в том, что оно работает так, как задумано.Значения stageX и stageY вычисляются при вызове метода получения с использованием цели события для преобразования localToGlobal.Это необходимо для того, чтобы числа оставались верными, даже если целевой объект изменил положение, масштаб или поворот с момента отправки события.
Если вам действительно нужно повторно отправить MouseEvent с правильными значениями stageX и stageY, у вас есть два варианта:
Создайте собственный подкласс MouseEvent, который переопределяет методы получения stageX и stageY.Вы можете либо сохранить исходную цель и выполнить вычисления localToGlobal самостоятельно, либо сохранить статические значения для stageX и stageY, используя значения, которые имеются при клонировании исходного события.
Расширьте Sprite и добавьте на сцену диспетчер, чтобы стандартный MouseEvent работал правильно.