Перемещение окна Flex GUI в замешательстве из-за области просмотра Papervision3D - PullRequest
1 голос
/ 19 января 2009

Я занимаюсь разработкой приложения для Flex 2 и заметил, что часть библиотеки, которая отвечает за перемещение окон графического интерфейса (TitleWindow s) при перетаскивании их мышью, запутывается, если есть нажатие (buttonMode = true) спрайт под ними. Когда я говорю «сбит с толку», я имею в виду, что окно какое-то время нормально перемещается, но затем в какой-то момент «перепрыгивает» в верхний левый угол приложения flash и делает там очень незначительные движения. Затем в какой-то другой момент он возвращается назад. Это сложнее объяснить, чем испытать, поэтому, пожалуйста, посмотрите сами. Вот как воспроизвести проблему:

  1. Перейти к http://www.panocast.com
  2. В левой боковой панели выберите «Недвижимость»
  3. В правом нижнем углу окна флеш-памяти выберите «высокое разрешение», щелкнув по крайнему правому значку.
  4. Когда (часть) видео загружается, нажмите на лестницу. Откроется окно TitleWindow.
  5. Попробуйте перетащить его по экрану. Когда курсор мыши перемещается над одной из активируемых областей (например, лестница), окно не помещается.

(Извините, но не могу дать вам прямую ссылку, часть страницы генерируется динамически.)

(Что делает проблему еще более интересной, так это то, что для меня в режиме «низкого разрешения» проблема не возникает! Разница между различными режимами очень мала.) Я был бы очень признателен, если бы кто-то сказал мне, что было что здесь происходит и как это можно исправить.

Я не уверен, имеет ли это значение, но лежащий в основе спрайт - это на самом деле не просто спрайт, а объект визуализации Papervision3D с некоторыми трехмерными элементами. Я говорю об этом, потому что возможно, что неправильные координаты мыши как-то получены из текстуры UV, отображаемой на интерактивных объектах.

Ответы [ 3 ]

1 голос
/ 19 января 2009

Трудно отладить без какого-либо источника; что-то явно вызывает либо move (), либо устанавливает свойства x и y в этом TitleWindow и планирует его перемещение.

Когда я впервые прочитал пост, он "пах", как будто где-то проскальзывание вращения (иногда использование Math.atan против Math.atan2 может иметь такой эффект), так что вы правы, оно может делать с PaperVision, предполагая, что вы не используете Math.atan или устанавливаете свойства поворота самостоятельно где-либо. Просто подумал, что упомяну это, хотя, вероятно, это не происходит в вашем случае. Вы никогда не знаете, хотя. ;)

Скорее всего, LayoutManager перемещает компонент в ответ на изменение свойства компонента. Документы Flex объясняют , что в дополнение к установке его свойств x и y и явным вызовам move () событие UIComponent move также может вызываться, когда любое из следующих других свойств изменить:

  • minWidth
  • minHeight
  • maxWidth
  • MaxHeight
  • explicitWidth
  • explicitHeight

PaperVision или нет, возможно, эта информация поможет вам изолировать источник перемещения. Удачи.

1 голос
/ 21 января 2009

Я понял это. По-видимому, это проблема Papervision3D. Внутри Papervision3D существует класс VirtualMouse, который должен генерировать MouseEvent программно. Это происходит, например, когда пользователь взаимодействует с любым из интерактивных объектов на сцене, например, Plane с интерактивным материалом на нем (как в моем случае).

Проблема в том, что координаты x и y сгенерированного события представляют собой координаты текстуры UV (как я и подозревал), а не координаты экрана реального мира. При перетаскивании TitleWindow (или любого объекта Panel) к SystemManager добавляется обработчик mouseMove (среди прочего), который затем использует свойства stageX и stageY объекта события для определить новую позицию окна. К сожалению, для событий мыши VirtualMouse они недопустимы, поскольку исходные координаты x, y, которые, вероятно, используются для определения глобальных координат сцены, как я уже сказал, не являются экранными координатами .

Честно говоря, я все еще не уверен, используются ли события, отправляемые VirtualMouse, где-либо внутри самого Papervision3D, или они просто предлагаются для удобства, но они, несомненно, затрудняют интеграцию области просмотра в программу Flex. Предполагая, что такие события не нужны для самого PV3D, для моей проблемы существует однострочное исправление, которое необходимо добавить сразу после создания области просмотра:

viewport.interactiveSceneManager.virtualMouse.
    disableEvent(MouseEvent.MOUSE_MOVE);

Кстати, была очень похожая (или, точнее, та же самая) ошибка с перетаскиванием ползунков, также исправленная этой линией.

1 голос
/ 19 января 2009

Мне удалось воспроизвести это и в режиме низкого разрешения, поэтому я не думаю, что это связано с разрешением.

Это похоже на то, что MouseEvent обрабатывается с помощью TitleWindow И окна Papervision3D. Возможно, вам нужно принудительно использовать stopImmediatePropagation () для одного или другого? Или, может быть, отключить обработку MouseEvent для окна Pv3D, когда появится окно TitleWindow?

...