使用htmlloader

时间:2015-12-05 04:46:45

标签: actionscript-3 air embedding

我正在制作一个可编辑的舞台,用户可以在其中添加图片,视频和嵌入内容。目前,所有对象都驻留在名为Space的类文件中。您可以添加的所有对象都位于spaces内部的bounds_mc内。这些对象称为SpaceObjects,由类文件SpaceObject ...

处理

现在,当我告诉我的SpaceObject添加一个嵌入时,它会这样做,但是......这有点问题。

enter image description here

当我添加对象时,我无法与之完全交互。我可以使用与突出显示文本时相同的鼠标图标突出显示它。但没有别的。我可以将bounds_mc移动得很好(它后面的空白区域)并让该对象相应地移动......但没有别的。

现在,如果我将这个对象直接添加到舞台上,将舞台一直传递到我的Space类并执行stagee.addChild(htmlLoader),这个问题就解决了。

起初我以为这是因为它出现在一堆影片中,或者在显示器中出现了一些订单问题...但是这个测试证明了这一点。

enter image description here

我有三个动画片段中的HtmlLoader,我能够很好地与embedd交互。我试图找出可能导致这种情况的原因。我已经尝试过切换HtmlLoader从这里到那里的地方,但我仍然遇到这个问题。

这里是嵌入式

<iframe width="560" height="315" src="https://www.youtube.com/embed/Kzgjiuvpmsk" frameborder="0" allowfullscreen></iframe>

这是我的Space类中的一个示例,用于处理菜单中的用户输入。

                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的摘录。它处理从它的构造函数传递的参数。在这种情况下,它生成我的嵌入。第一个参数是source。第二个是动作(嵌入的字符串)

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上所涉及的类文件的链接..所有空间对象都驻留在Space中。 Space驻留在SpaceContainer中。

SpaceContainer.as

Space.as

SpaceObject.as

编辑12/5/15:一个有趣的说明。单击时,e.target将作为精灵返回。当点击其他对象(无论是图像还是视频)时,它们将作为我的SpaceObject返回。当我将它添加到舞台时,以及当我将它添加到bounds_mc时,都会发生这种情况。

e.target = [object Sprite] vs e.target = [object SpaceObject]

编辑12/5/15:看起来对象的任何更改(除了x和y)都会禁用嵌入内的任何交互式对象并将其转换为某种位图。

1 个答案:

答案 0 :(得分:0)

调整。

看起来当您调整大小或更改包含嵌入的任何显示对象时(放置对象之前或之后),它将禁用嵌入。

这一行在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;
            }
        }