【问题标题】:Flex: How can I pop up a component in the center of the user's viewable area?Flex:如何在用户可视区域的中心弹出一个组件?
【发布时间】:2011-06-27 02:57:42
【问题描述】:

假设我有一个尺寸大于用户屏幕分辨率的应用程序。通常,在添加弹出窗口时,我会调用popupManager.addPopup(),后跟popupManager.centerPopup(),但这可能会导致弹出窗口被添加到用户在屏幕上的可见区域之外。

有没有办法在用户的当前可视区域中间添加一个弹出窗口?

编辑: 这是一个简单的例子:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               width="3000" height="2000" 
               creationComplete="creationCompleteHandler(event)">

  <fx:Script>
    <![CDATA[

      import mx.managers.PopUpManager;          
      import spark.components.TitleWindow;

      public var myWindow:TitleWindow = new TitleWindow;

      protected function creationCompleteHandler(event:FlexEvent):void
      {
        myWindow.title = "My Title Window";
        PopUpManager.addPopUp(myWindow, DisplayObject(FlexGlobals.topLevelApplication), false);
        PopUpManager.centerPopUp(myWindow);
      }

    ]]>
  </fx:Script>

  <s:BorderContainer width="3000" height="2000" backgroundColor="0x000000" />
</s:Application>

示例 1:

+==========================+---------------------+
|      Viewable Area       |                     |
|                          |                     |
|     +-------------+      |                     |
|     |  I want the |      |                     |
|     |   popup to  |      |                     |
|     |   go here.  |      |                     |
|     +-------------+      |                     |
|                          |                     |
|                          |                     |
+==========================+                     |
|                                                |
|                Rest of Application             |
|                                                |
|                                                |
|                                                |
|                                                |
+------------------------------------------------+

示例 2:

+------------------------------------------------+
|                                                |
|                Rest of Application             |
|                                                |
|                                                |
|                +===========================+   |
|                |       Viewable Area       |   |
|                |                           |   |
|                |      +-------------+      |   |
|                |      |  I want the |      |   |
|                |      |   popup to  |      |   |
|                |      |   go here.  |      |   |
|                |      +-------------+      |   |
|                |                           |   |
|                |                           |   |
|                +===========================+   |
|                                                |
+------------------------------------------------+

【问题讨论】:

  • 我原以为 centerPopUp 将组件置于应用程序可见区域的中心。既然您说“可能导致”而不是“确实导致”,您是否有代码证明情况并非如此,或者您只是想为您认为可能发生的事情做准备?您想将项目相对于 Application 标签的本地坐标居中,但您说它是基于内容坐标居中的。你确定这是正确的吗? livedocs.adobe.com/flex/3/html/…
  • @Flextras,我添加了一个快速代码片段来演示我所指的问题。

标签: apache-flex actionscript-3 popup


【解决方案1】:

centerPopUp() 使用传递给addPopUp()createPopUp()parent 对象作为居中弹出窗口的参考。如果parent 是应用程序,那么它应该已经基于应用程序的widthheight 居中——从Flex 的角度来看,这就是“可视区域”。

所以尝试将应用程序对象作为parent 参数传递给addPopUp()createPopUp()

【讨论】:

  • 感谢您的回复。我添加了一个快速代码片段来演示我所指的问题。希望这有助于更好地解释事情。 :)
  • PopUpManager.createPopUp(parentApplication as DisplayObject, ..., ...) 可以解决中心问题。
【解决方案2】:

您可以使用 stage 属性的 stageWidth 和 stageHeight 属性手动计算:

dlg.x = (this.stage.stageWidth / 2) - (dlg.width / 2);
dlg.y = (this.stage.stageHeight / 2) - (dlg.height / 2);

可能有一种更“正确”的方法来获取可视区域的尺寸,但我发现这样可以完成工作。

希望对您有所帮助。

编辑:修正了我的错误信息:)

【讨论】:

  • @Wade Mueller,我似乎找不到systemManagerwidthheight 属性。 Flex 4 中是否存在这些属性?
  • @Jason,对此感到抱歉,不知道我在想什么。编辑了我对更有意义的答案:)
  • @Wade Mueller,感谢您的编辑。不幸的是,在调用myTitleWindow.move(_x,_y); 后,弹出窗口仍然会弹出屏幕,其中_x_y 分别是(this.stage.stageWidth / 2) - (dlg.width / 2)(this.stage.stageHeight / 2) - (dlg.height / 2)。我没有正确实施它吗?
  • 嗯,这对我来说是正确的。如果我是你,我会先设置断点并逐步执行计算,或者使用跟踪语句查看窗口 x 和 y 值的前/后值。
  • @Wade Mueller,这是使用我在上面发布的相同示例的跟踪结果:BEFORE MOVING: myWindow.x = 0, myWindow.y = 0 AFTER MOVING: myWindow.x = 1430, myWindow.y = 962。有什么想法吗?
猜你喜欢
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2020-02-19
  • 2013-10-31
  • 1970-01-01
  • 2013-05-10
相关资源
最近更新 更多