1

TitleWindow我正在开发一个 Flex 2 应用程序,我注意到当你用鼠标拖动它们时负责移动 GUI 窗口 (s) 的库的一部分如果buttonMode = true它们下面有一个可点击的 () 精灵会感到困惑。当我说困惑时,我的意思是窗口正常移动了一段时间,但在某些时候“跳”到了 Flash 应用程序的左上角,并在那里进行了非常小的移动。然后在另一个点它跳回来。解释比体验更难,所以请自己去看看。以下是重现问题的方法:

  1. 访问http://www.panocast.com
  2. 在左侧边栏中,选择“房地产”
  3. 在 Flash 窗口的右下角,单击最右侧的图标选择“高分辨率”。
  4. 当(部分)视频加载时,单击楼梯。将弹出一个标题窗口。
  5. 尝试在屏幕上拖动它。当鼠标光标移到可点击区域之一(如楼梯)上方时,窗口会错位。

(抱歉,不能直接给你链接,部分页面是动态生成的。)

(让问题更有趣的是,对我来说,在“低分辨率”模式下,问题不会发生!各种模式之间几乎没有区别。)如果有人告诉我这里发生了什么,我将不胜感激以及如何修复它。

我不确定它是否重要,但底层精灵实际上不仅仅是普通精灵,而是一个 Papervision3D 渲染器对象,其中包含一些 3D 元素。我之所以这么说,是因为不正确的鼠标坐标可能来自映射在可点击对象上的纹理 UV。

4

3 回答 3

1

我也设法在低分辨率模式下复制了它,所以我认为它与分辨率无关。

这看起来是因为 MouseEvent 正在由 TitleWindow 和 Papervision3D 窗口处理。也许您需要在其中一个上强制 stopImmediatePropagation() ?或者当 TitleWindow 弹出时关闭 Pv3D 窗口的 MouseEvent 处理?

于 2009-01-19T15:46:49.397 回答
1

没有源代码很难调试。有些东西显然在调用 move() 或在 TitleWindow 上设置 x 和 y 属性并安排它被移动。

当我第一次阅读这篇文章时,它“闻起来”像是某个地方的旋转错误计算(使用 Math.atan 与 Math.atan2 有时会产生这种效果),所以你是对的,它可能与 PaperVision 有关,假设您没有在任何地方使用 Math.atan 或自己设置旋转属性。只是想我会提到它,尽管在您的情况下可能不会发生。不过,你永远不知道。;)

LayoutManager 更有可能移动组件以响应组件上的属性更改。 Flex 文档解释说,除了设置其 x 和 y 属性以及显式调用 move() 之外,当以下任何其他属性发生更改时,也可以触发UIComponent 的移动事件:

  • 最小宽度
  • 最小高度
  • 最大宽度
  • 最大高度
  • 显式宽度
  • 显式高度

PaperVision 与否,也许该信息可以帮助您隔离移动的来源。祝你好运。

于 2009-01-19T17:51:01.937 回答
1

我想通了。显然,这是一个 Papervision3D 问题。Papervision3D 内部有一个名为 的类VirtualMouse,它应该以MouseEvent编程方式生成 s。例如,当用户与舞台上的任何交互式对象交互时,就会发生这种情况,例如,上面Plane有交互式材料(如我的例子)。

问题是生成事件的 x 和 y 坐标代表纹理 UV 坐标(正如我所怀疑的那样),而不是真实世界的屏幕坐标。当一个TitleWindow(或任何Panel对象)被拖动时,一个“mouseMove”处理程序(以及其他)被添加到SystemManager,然后使用事件对象的stageXstageY属性来确定窗口的新位置。不幸的是,对于VirtualMouse的鼠标事件,这些是无效的,因为可能用于确定全局舞台坐标的原始 x,y 坐标,正如我所说的,不是屏幕坐标

老实说,我仍然不确定由VirtualMousePapervision3D 内部的任何地方是否使用派发的事件,或者它们只是为了方便而提供,但它们确实使得将视口集成到 Flex 程序中变得困难。假设 PV3D 本身不需要此类事件,我的问题有一个单行修复,必须在创建视口后立即添加:

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

顺便说一句,拖动滑块有一个非常相似(或者更确切地说是相同)的错误,也由这条线修复。

于 2009-01-21T11:02:10.357 回答