Перемещение окна Flex GUI в замешательстве из-за основного окна просмотра Papervision3D
Я разрабатываю приложение Flex 2, и я заметил ту часть библиотеки, которая отвечает за перемещение окон графического интерфейса пользователя (TitleWindow
s) вокруг, когда вы перетаскиваете их мышью, запутывается, если есть нажатие (buttonMode = true
спрайт под ними. Когда я говорю "сбит с толку", я имею в виду, что окно какое-то время нормально перемещается, но затем в какой-то момент "прыгает" в верхний левый угол приложения flash и делает там очень незначительные движения. Затем в какой-то другой момент он возвращается назад. Это сложнее объяснить, чем испытать, поэтому, пожалуйста, посмотрите сами. Вот как воспроизвести проблему:
- Перейти на http://www.panocast.com/
- В левой боковой панели выберите "Недвижимость"
- В правом нижнем углу окна флеш-памяти выберите "высокое разрешение", нажав на самый правый значок.
- Когда (часть) видео загружается, нажмите на лестницу. Откроется окно TitleWindow.
- Попробуйте перетащить его по экрану. Когда курсор мыши перемещается над одной из интерактивных областей (например, лестница), окно не помещается.
(Извините, но не могу дать вам прямую ссылку, часть страницы генерируется динамически.)
(Что делает проблему еще более интересной, так это то, что для меня в режиме "низкого разрешения" проблема не возникает! Разница между различными режимами очень мала.) Я был бы очень признателен, если бы кто-нибудь рассказал мне, что здесь происходит. и как это можно исправить.
Я не уверен, имеет ли это значение, но лежащий в основе спрайт на самом деле является не просто спрайтом, а скорее объектом визуализации Papervision3D с некоторыми трехмерными элементами. Я говорю об этом, потому что возможно, что неправильные координаты мыши каким-то образом получены из текстуры UV, отображаемой на интерактивных объектах.
3 ответа
Я понял это. По-видимому, это проблема Papervision3D. Внутри Papervision3D есть класс, который называется VirtualMouse
, который должен генерировать MouseEvent
с программно. Это происходит, например, когда пользователь взаимодействует с любым из интерактивных объектов на сцене, например, Plane
с интерактивным материалом на нем (как в моем случае).
Проблема состоит в том, что координаты x и y сгенерированного события представляют собой координаты текстуры UV (как я и подозревал), а не координаты экрана реального мира. Когда TitleWindow
(или любой Panel
объект), обработчик "mouseMove" (среди прочего) добавляется к SystemManager
, который затем использует stageX
а также stageY
свойства объекта события для определения новой позиции окна. К сожалению для VirtualMouse
События мыши, они недопустимы, поскольку исходные координаты x,y, которые, вероятно, используются для определения глобальных координат сцены, как я уже сказал, не являются экранными координатами.
Честно говоря, я до сих пор не уверен, отправили ли события VirtualMouse
используются в любом месте самого Papervision3D, или они просто предлагаются для удобства, но они, безусловно, затрудняют интеграцию области просмотра в программу Flex. Предполагая, что такие события не нужны для самого PV3D, для моей проблемы существует однострочное исправление, которое нужно добавить сразу после создания области просмотра:
viewport.interactiveSceneManager.virtualMouse.
disableEvent(MouseEvent.MOUSE_MOVE);
Кстати, была очень похожая (или, точнее, та же самая) ошибка с перетаскиванием ползунков, также исправленная этой линией.
Мне удалось воспроизвести это и в режиме низкого разрешения, поэтому я не думаю, что это связано с разрешением.
Это происходит потому, что MouseEvent обрабатывается с помощью TitleWindow И окна Papervision3D. Возможно, вам нужно принудительно использовать stopImmediatePropagation() для одного или другого? Или, может быть, отключить обработку MouseEvent для окна Pv3D, когда появится окно TitleWindow?
Это сложный для отладки без какого-либо источника; что-то явно вызывает либо move(), либо устанавливает свойства x и y в этом TitleWindow и планирует его перемещение.
Когда я впервые прочитал пост, он "пах", как будто где-то проскальзывание вращения (иногда использование Math.atan против Math.atan2 может иметь такой эффект), так что вы правы, это может иметь какое-то отношение к PaperVision при условии, что вы не используете Math.atan и не устанавливаете свойства поворота самостоятельно. Просто подумал, что упомяну это, хотя, вероятно, это не происходит в вашем случае. Вы никогда не знаете, хотя.;)
Скорее всего, LayoutManager перемещает компонент в ответ на изменение свойства компонента. Документы Flex объясняют, что помимо установки свойств x и y и явных вызовов метода move(), событие перемещения UIComponent также может запускаться при изменении любого из следующих других свойств:
- MinWidth
- MinHeight
- Максимальная ширина
- максимальная высота
- explicitWidth
- explicitHeight
PaperVision или нет, возможно, эта информация поможет вам изолировать источник перемещения. Удачи.