【问题标题】:AS3: Extending Loader, how to draw border on its contentAS3:扩展加载器,如何在其内容上绘制边框
【发布时间】:2026-01-25 18:00:01
【问题描述】:

我正在扩展Loader(),是否可以在不借助一些技巧的情况下在内容周围绘制边框?我知道 Loader 不能有任何额外的孩子,否则我只会为内容大小创建一个形状并添加它。但是有没有办法强制或强制转换内容对象以便在其上使用绘图 API?

【问题讨论】:

    标签: apache-flex flash actionscript-3


    【解决方案1】:

    通常,您只需在加载时将内容添加到显示对象并根据需要对其进行操作:

    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, eventCompleteHandler);
    loader.load(new URLRequest(URL));
    
    function eventCompleteHandler(event:Event):void
    {
        addChild(createElementWithBorder(event.target.content));
    }
    
    function createElementWithBorder(content:DisplayObject):DisplayObject
    {
        var container:Sprite = new Sprite();
    
        container.addChild(content);
    
        var border:Shape = container.addChild(new Shape()) as Shape;
        border.graphics.lineStyle(2,0x000000);
        border.graphics.drawRect(0, 0, content.width,content.height);
    
       return container;
    }
    

    ...但是如果您仍然对不能将 Loader 用作 DisplayObjectContainer 感到恼火,使用合成可能是线索(以下只是一个简单的示例,当然需要适应):

    public class LoaderBorder extends Sprite
    {
    
        private var loader:Loader;
    
        public function LoaderBorder()
        {
            loader = new Loader()
        }
    
        public function load(url:String):void
        {
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, eventCompleteHandler);
            loader.load(new URLRequest(url));
        }
    
        private function eventCompleteHandler(event:Event):void
        {
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, eventCompleteHandler);
    
            var content:DisplayObject = event.target.content;
    
            var border:Shape = new Shape();
            border.graphics.lineStyle(2,0x000000);
            border.graphics.drawRect(0, 0, content.width,content.height);
    
            addChild(content);
            addChild(border);
    
        }
    }
    

    像加载器一样使用:

    var test:LoaderBorder = new LoaderBorder()
    addChild(test);
    test.load(URL);    
    

    【讨论】:

    • 是的,在看到您的帖子之前,这就是我最终所做的。谢谢
    • 合成路线是
    • 酷,是的,当您想在一个实现中结合多种类型的优点/功能时,这通常会很好。
    【解决方案2】:

    是的,您可以投射加载器的内容。 当您加载图像时,您可以这样做(在图像完全加载后):

    Bitmap(yourLoader.content);
    

    如果使用 SWF,我认为您可以做到这一点(尚未测试):

    Sprite(yourLoader.content);
    

    【讨论】:

      【解决方案3】:

      您可以将过滤器添加到包含加载器的movieClip。

      我认为“发光”或“投影”可能是一个很好的效果。如果你设置正确。

      【讨论】: