将app:/ images加载到Adobe Air Flex4.5中的HTMLLoader中?

时间:2011-05-31 23:30:56

标签: actionscript-3 flex air flex4

我正在使用Adobe AIR构建一个应用程序,其中包含一个mx:HTML的浏览组件。此浏览器将用于加载外部内容(例如,http://google.com等公共可访问的URL),在外部内容加载后,我将CSS和JS注入HTMLLoader,为我的应用程序提供其他UI组件。

那部分工作正常。我的JS代码由WebKit执行;我的CSS规则由WebKit使用。使用我用CSS和JS创建的UI组件,我想要使用一些图像。到目前为止,我已成功通过data URI scheme在HTMLLoader中渲染图像,但这迫使我在assets /文件夹中制作base64编码的副本(添加到CSS规则中)。

我希望能够使用HTMLLoader加载外部URL,然后添加CSS,JS和Images以在同一HTMLLoader中创建UI组件。我知道HTMLLoader属性placeLoadStringContentInApplicationSandbox,但是如果我将用于将本地图像从我的assets /加载到HTMLLoader中,那么IMG标记的HTML内容会是什么样的,即如何引用图像?

关于如何将本地图像加载到HTMLLoader对象的内容中的任何其他想法?

更新

我尝试了第一个评论员的想法,使用src =“app:/path/to/image.png”没有运气。

这就是我的所作所为:

<mx:HTML id="browser"/> 
<fx:Script>
<![CDATA[
browser.addEventListener(Event.COMPLETE,browserEventCompleteHandler);    
browser.htmlLoader.placeLoadStringContentInApplicationSandbox = true; // have set to true and false with no difference.
....initiate browser load....
private function browserEventCompleteHandler(event:Event):void 
{
    var img:* = browser.domWindow.document.createElement('IMG');
    img.src = "app:/assets/arrow_refresh.png";
    img.width="300";
    img.height="300";
    browser.domWindow.document.getElementsByTagName('body')[0].appendChild(img);
}
]]>
</fx:Script>

运行上面的代码,我看到IMG元素被添加到宽度和高度为300px的外部内容中,但PNG图像本身不会呈现。只需看一个空的300px正方形的IMG元素。

最终更新

答案解决了我的问题,但有一个改变。我使用File和FileStream类而不是URLRequest来加载png。这是我做的:

var f:File = File.applicationDirectory.resolvePath("app:/assets/arrow_refresh.png");
var s:FileStream = new FileStream();
s.open(f, flash.filesystem.FileMode.READ);
var data:ByteArray = new ByteArray();
s.readBytes(data,0,s.bytesAvailable);
var b64Encoder : Base64Encoder = new Base64Encoder;
b64Encoder.encodeBytes(data);

2 个答案:

答案 0 :(得分:4)

为什么不在运行时在base64中编码图像?

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.html.HTMLLoader;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;

    // Base64Encoder from as3corelib (https://github.com/mikechambers/as3corelib)
    import mx.utils.Base64Encoder;

    public class TestHtml extends Sprite
    {
        private var _htmlLoader : HTMLLoader = new HTMLLoader();

        private var _rawImgLoader : URLLoader = new URLLoader; 

        public function TestHtml()
        {
            super();

            _htmlLoader.width = stage.stageWidth;
            _htmlLoader.height = stage.stageHeight;

            // Load google page
            _htmlLoader.load(new URLRequest("http://www.google.fr"));
            _htmlLoader.addEventListener(Event.COMPLETE,   onEvent);

            // Load one image
            _rawImgLoader.dataFormat = URLLoaderDataFormat.BINARY;
            _rawImgLoader.addEventListener(Event.COMPLETE, onEvent);
            _rawImgLoader.load(new URLRequest("logo.png"));

            addChild(_htmlLoader);
        }

        private function onEvent(e:Event) : void
        {
            addImg();
        }

        private function addImg() : void
        {
            // Wait for img and html
            if(_htmlLoader.loaded && _rawImgLoader.data)
            {
                // Encode img
                var b64Encoder : Base64Encoder = new Base64Encoder;
                b64Encoder.encodeBytes(_rawImgLoader.data);

                var img:Object = _htmlLoader.window.document.createElement('IMG');
                img.src = "data:image/png;base64," + b64Encoder.flush();
                img.width="300";
                img.height="300";
                var body :Object = _htmlLoader.window.document.getElementsByTagName('div');
                body[0].appendChild(img);
            }
        }
    }
}

答案 1 :(得分:1)

placeLoadStringContentInApplicationSandbox不起作用,因为您的内容未从字符串加载,而是从外部网址加载。并且远程内容被限制使用本地文件。如果你加载html并手动将它设置为htmlText属性,它将成为本地内容,但这可能有问题(如页面闪烁。)

相关问题