使用 htmlloader 嵌入对象的问题
Issues with embedding objects using htmlloader
我正在制作一个可编辑的舞台,用户可以在其中添加图像、视频和嵌入式内容。当前所有对象都驻留在名为 Space 的 class 文件中。您可以添加的所有对象都位于 space 内的 bounds_mc 内。这些对象称为 Space对象,由 class 文件处理 Space对象...
现在,当我告诉我的 SpaceObject 添加一个嵌入时,它确实做到了,但是..有一点问题。
当我添加对象时,我无法完全与之交互。我可以使用与突出显示文本时看到的鼠标图标相同的鼠标图标来突出显示它……但除此之外别无他法。我可以很好地移动 bounds_mc(它后面的白色 space)并让那个对象相应地移动..但没有别的。
现在,如果我通过将舞台一直向下传递到我的 Space class 并执行 stagee.addChild(htmlLoader) 来将此对象直接添加到舞台,此问题将得到解决.
起初我以为这是因为它在一堆电影片段中或显示列表中存在某种顺序问题...但这次测试证明了这一点。
我在三个动画片段中安装了 HtmlLoader,我可以很好地与嵌入的交互。我想弄清楚是什么原因造成的。我已经尝试切换 HtmlLoader 从这里到那里的位置,但我仍然遇到这个问题。
这是嵌入的
<iframe width="560" height="315" src="https://www.youtube.com/embed/Kzgjiuvpmsk" frameborder="0" allowfullscreen></iframe>
这是我的 Space class 中的一个示例,它处理菜单中的用户输入。
case "embeddedobject":
trace("Embeddedobject");
//For now, just testing a standard embedd from youtube. Dynamics later.
var so:SpaceObject = new SpaceObject("embeddedobject", '<iframe width="560" height="315" src="https://www.youtube.com/embed/Kzgjiuvpmsk" frameborder="0" allowfullscreen></iframe>', new Rectangle(rightMouseX, rightMouseY));
bounds_mc.addChild(so);
//Tested with and without the eventlistener..same results
so.addEventListener(MouseEvent.CLICK, contentClickHandler);
spaceObjects.push(so);
break;
这是 SpaceObject 的摘录。它处理从它的构造函数传递的参数。在这种情况下,它生成了我的嵌入。第一个参数是来源。第二个是动作(嵌入的字符串)
public function SpaceObject(source:String, actions:String, bounds:Rectangle, rotation:int=0, matrixx:Matrix = null)
{
//...
if (source == "embeddedobject")
{
htmlLoader = new HTMLLoader();
htmlLoader.placeLoadStringContentInApplicationSandbox = true;
htmlLoader.loadString(actions);
htmlLoader.addEventListener(Event.COMPLETE, handleHtmlLoadComplete);
}
//...
}
private function handleHtmlLoadComplete(e:Event):void
{
trace("Html content load complete");
htmlLoader.removeEventListener(Event.COMPLETE, handleHtmlLoadComplete);
htmlLoader.width = htmlLoader.contentWidth;
htmlLoader.height = htmlLoader.contentHeight;
addChild(htmlLoader);
}
这是我在 pastebin 上制作的 class 文件的链接。所有 space 对象都位于 Space 中。 Space 驻留在 Space 容器中。
编辑 2015 年 12 月 5 日:一个有趣的注释。单击时,e.target 作为精灵返回。单击其他对象(无论是图像还是视频)时,它们将作为我的 SpaceObject 返回。当我将它添加到舞台时,以及当我将它添加到 bounds_mc.
时,都会发生这种情况
e.target = [object Sprite] vs e.target = [object SpaceObject]
编辑 2015 年 12 月 5 日:看起来对象的任何改变(除了它的 x 和 y)都会禁用嵌入内的任何交互式对象并将其变成某种位图。
调整大小。
看起来当您调整或改变任何包含嵌入的显示对象时(在您放置对象之前或之后)它会禁用嵌入。
这一行在 main.as 中并且正在构建 SpaceContainer。
var sc:SpaceContainer = new SpaceContainer(stage);
//resize(sc, stage.stageWidth, stage.stageHeight);
...
private function resize(mc:DisplayObject, maxW:Number, maxH:Number = 0, constrainProportions:Boolean = true):void
{
maxH = maxH == 0 ? maxW : maxH;
mc.width = maxW;
mc.height = maxH;
if (constrainProportions)
{
mc.scaleX < mc.scaleY ? mc.scaleY = mc.scaleX : mc.scaleX = mc.scaleY;
}
}
我正在制作一个可编辑的舞台,用户可以在其中添加图像、视频和嵌入式内容。当前所有对象都驻留在名为 Space 的 class 文件中。您可以添加的所有对象都位于 space 内的 bounds_mc 内。这些对象称为 Space对象,由 class 文件处理 Space对象...
现在,当我告诉我的 SpaceObject 添加一个嵌入时,它确实做到了,但是..有一点问题。
当我添加对象时,我无法完全与之交互。我可以使用与突出显示文本时看到的鼠标图标相同的鼠标图标来突出显示它……但除此之外别无他法。我可以很好地移动 bounds_mc(它后面的白色 space)并让那个对象相应地移动..但没有别的。
现在,如果我通过将舞台一直向下传递到我的 Space class 并执行 stagee.addChild(htmlLoader) 来将此对象直接添加到舞台,此问题将得到解决.
起初我以为这是因为它在一堆电影片段中或显示列表中存在某种顺序问题...但这次测试证明了这一点。
我在三个动画片段中安装了 HtmlLoader,我可以很好地与嵌入的交互。我想弄清楚是什么原因造成的。我已经尝试切换 HtmlLoader 从这里到那里的位置,但我仍然遇到这个问题。
这是嵌入的
<iframe width="560" height="315" src="https://www.youtube.com/embed/Kzgjiuvpmsk" frameborder="0" allowfullscreen></iframe>
这是我的 Space class 中的一个示例,它处理菜单中的用户输入。
case "embeddedobject":
trace("Embeddedobject");
//For now, just testing a standard embedd from youtube. Dynamics later.
var so:SpaceObject = new SpaceObject("embeddedobject", '<iframe width="560" height="315" src="https://www.youtube.com/embed/Kzgjiuvpmsk" frameborder="0" allowfullscreen></iframe>', new Rectangle(rightMouseX, rightMouseY));
bounds_mc.addChild(so);
//Tested with and without the eventlistener..same results
so.addEventListener(MouseEvent.CLICK, contentClickHandler);
spaceObjects.push(so);
break;
这是 SpaceObject 的摘录。它处理从它的构造函数传递的参数。在这种情况下,它生成了我的嵌入。第一个参数是来源。第二个是动作(嵌入的字符串)
public function SpaceObject(source:String, actions:String, bounds:Rectangle, rotation:int=0, matrixx:Matrix = null)
{
//...
if (source == "embeddedobject")
{
htmlLoader = new HTMLLoader();
htmlLoader.placeLoadStringContentInApplicationSandbox = true;
htmlLoader.loadString(actions);
htmlLoader.addEventListener(Event.COMPLETE, handleHtmlLoadComplete);
}
//...
}
private function handleHtmlLoadComplete(e:Event):void
{
trace("Html content load complete");
htmlLoader.removeEventListener(Event.COMPLETE, handleHtmlLoadComplete);
htmlLoader.width = htmlLoader.contentWidth;
htmlLoader.height = htmlLoader.contentHeight;
addChild(htmlLoader);
}
这是我在 pastebin 上制作的 class 文件的链接。所有 space 对象都位于 Space 中。 Space 驻留在 Space 容器中。
编辑 2015 年 12 月 5 日:一个有趣的注释。单击时,e.target 作为精灵返回。单击其他对象(无论是图像还是视频)时,它们将作为我的 SpaceObject 返回。当我将它添加到舞台时,以及当我将它添加到 bounds_mc.
时,都会发生这种情况e.target = [object Sprite] vs e.target = [object SpaceObject]
编辑 2015 年 12 月 5 日:看起来对象的任何改变(除了它的 x 和 y)都会禁用嵌入内的任何交互式对象并将其变成某种位图。
调整大小。
看起来当您调整或改变任何包含嵌入的显示对象时(在您放置对象之前或之后)它会禁用嵌入。
这一行在 main.as 中并且正在构建 SpaceContainer。
var sc:SpaceContainer = new SpaceContainer(stage);
//resize(sc, stage.stageWidth, stage.stageHeight);
...
private function resize(mc:DisplayObject, maxW:Number, maxH:Number = 0, constrainProportions:Boolean = true):void
{
maxH = maxH == 0 ? maxW : maxH;
mc.width = maxW;
mc.height = maxH;
if (constrainProportions)
{
mc.scaleX < mc.scaleY ? mc.scaleY = mc.scaleX : mc.scaleX = mc.scaleY;
}
}