【问题标题】:Load images using loader class and send the images in an arrayCollection使用加载器类加载图像并将图像发送到 arrayCollection
【发布时间】:2014-07-07 07:19:54
【问题描述】:

我正面临一个我无法解决的特定问题。 我正在使用带有 Robotlegs 框架的 ActionScript 3。我必须在命令中发出一系列 URL 请求。每个 URL 都会给出一个图像。我将这些图像推送到一个 ArrayCollection 中,然后以这个 ArrayCollection 作为有效负载来调度一个事件。这个 ArrayCollection 被发送到使用 itemRenderer 来显示图像的视图。我检查了图像正在加载到 ArrayCollection,但图像没有显示在视图中。

这是我在命令中写的,

var arrayCollect:ArrayCollection = new ArrayCollection();
var my_loader:Loader = new Loader();

my_loader.load( new URLRequest( "http://www.joomlaworks.net/images/demos/galleries/abstract/7.jpg" ) );
arrayCollect.addItem(my_loader as Object );
my_loader.load( new URLRequest( "http://www.joomlaworks.net/images/demos/galleries/abstract/8.jpg" ) );
arrayCollect.addItem(my_loader as Object );

return arrayCollect;

然后 arrayCollect 作为有效负载在事件中被分派。

dispatch( new XYZEvent ( XYZEvent.LOAD_COMPLETE, arrayCollect ) );

在视图中,我使用了 itemRenderer。

<s:List id="pqr"
dataProvider="{data}">

....
</s:List>

图像未显示。我认为问题在于 arrayCollection 中的数据是“加载器”类型的对象。所以我尝试将它类型转换为 BitmapImage,但它并没有解决问题。

请帮我解决这个问题。

【问题讨论】:

  • 最好为此做一个loaderService

标签: actionscript-3 image-loading urlrequest robotlegs


【解决方案1】:

您的问题是您没有定义可以显示数据的项目渲染器。请参阅 http://help.adobe.com/en_US/Flex/4.0/UsingSDK/WS03d33b8076db57b9-23c04461124bbeca597-8000.html 以创建自定义项渲染器。

下一步:在您的 ArrayCollection 中,您没有创建新的加载器。这意味着 ArrayCollection 项目 1 指向相同的 laoder 是项目 2。

我添加了一个包含 2 个列表的示例,一个没有渲染器,一个带有自定义渲染器。我没有使用加载器,但您当然可以创建一个渲染器,将加载器添加到显示中,而不是使用 Flex 图像组件。

主要应用:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        private var _dataProviderList : ArrayCollection = new ArrayCollection(
            [
                "http://www.joomlaworks.net/images/demos/galleries/abstract/7.jpg",
                "http://www.joomlaworks.net/images/demos/galleries/abstract/8.jpg"
            ]
        );

    ]]>
</fx:Script>

<s:layout>
    <s:VerticalLayout/>
</s:layout> 

<s:List dataProvider="{_dataProviderList}">

</s:List>

<s:List itemRenderer="ImageItemRenderer" dataProvider="{_dataProviderList}">

</s:List>

</s:WindowedApplication>

渲染器

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            autoDrawBackground="true">


<mx:Image 
          source="{data}" 
          width="50" height="50"/>

</s:ItemRenderer>

如果您真的想在 ArrayCollection 中使用 laoder 作为对象,您可以将渲染器编写为:

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            autoDrawBackground="true">

<fx:Script>
    <![CDATA[

        [Bindable]
        private var _loader : Loader;

        private function dataLoaded (evt : Event) : void
        {
            _loader = (data as Loader) 
        }

        override public function set data(value:Object):void
        {
            super.data = value;

            if (data is Loader) {
                // render items may be reuses (http://stackoverflow.com/questions/7328989/itemrenderer-switching-urlloader-images)
                (data as Loader).contentLoaderInfo.removeEventListener(Event.COMPLETE, dataLoaded);

                // data allready loaded
                if ((data as Loader).content) {
                    _loader = (data as Loader)
                }
                else {
                    // wait till data is loaded
                    (data as Loader).contentLoaderInfo.addEventListener(Event.COMPLETE,dataLoaded);
                }
            }
        }
    ]]>
</fx:Script>

<mx:Image 
    source="{_loader}" 
    width="50" height="50"/>



</s:ItemRenderer>

【讨论】:

  • 这不是问题。我已经在 中定义了一个项目渲染器
  • 我需要在不同的程序中发出 URL 请求。在那个程序中,我正在获取图像并制作一个 ArrayCollection。我将此数组集合作为参数传递给项目渲染器。但是数组集合具有加载器类型的对象。我为数组集合写了一个trace命令,得到了这个,arrayCollect=======[object Loader],[object Loader],[object Loader]这样对吗?
  • 阅读您的问题,项目渲染器就是问题所在。如果您已经编写了自定义渲染器,则应将他的渲染器包含在您的问题中,以便给出正确答案。
  • 我提供了一个示例,您可以在其中使用 Loader 作为 ArrayCollection 中的项目
  • 我使用您的示例进行了一些更改,它解决了问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2017-07-12
  • 2016-06-23
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多