2012-08-30 45 views
0

我想为包含图像和标签的列表实现itemRenderer。列表中的数据提供者是我从后端有对象的列表:bytearray到图像

public class Object { 
private String label; 

private byte[] content; 

}

我的项目渲染:

<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx"> 
<s:layout> 
    <s:HorizontalLayout/> 
</s:layout> 
<mx:Image source="{data.content}"/> 
<s:Label text="{data.label}"/> 

我只拿到了一个破图片。有没有人知道为什么以及如何解决这个问题。 由于事先 Yayo

+0

是什么'打破image'是什么意思? – RIAstar

+0

它看起来像有一个图像,但你看不到图像 – ayahya82

+0

@ user628213分享截图? –

回答

0

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/components/Image.html#source

  • 位图或BitmapData实例。
  • 代表 DisplayObject子类的类。
  • BitmapFill实例化类并创建一个 位图渲染。 DisplayObject的一个实例。 BitmapFill将其复制到位图中进行填充。
  • 外部图像文件的名称。

spark.components.Image不能使用ByteArray实例作为源。 所以你需要将它转换为位图实例。

事情是这样的:

<?xml version="1.0"?> 
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"> 

    <fx:Script><![CDATA[ 
     private var _bytesLoader:Loader; 

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

      _loadBytes(data.bytes as ByteArray); 
     } 

     private function _loadBytes(bytes:ByteArray):void 
     { 
      _destroyBytesLoader(); 

      if (!bytes) 
      { 
       return; 
      } 

      _createBytesLoader(); 
      try 
      { 
       _bytesLoader.loadBytes(bytes); 
      } 
      catch (e:*) 
      { 
       _destroyBytesLoader(); 
      } 
     } 

     private function _createBytesLoader():void 
     { 
      _bytesLoader = new Loader(); 
      _bytesLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, _bytesLoader_completeHandler); 
      _bytesLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _bytesLoader_errorHandler); 
      _bytesLoader.contentLoaderInfo.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _bytesLoader_errorHandler); 
     } 

     private function _destroyBytesLoader():void 
     { 
      if (!_bytesLoader) 
      { 
       return; 
      } 

      _bytesLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, _bytesLoader_completeHandler); 
      _bytesLoader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, _bytesLoader_errorHandler); 
      _bytesLoader.contentLoaderInfo.removeEventListener(AsyncErrorEvent.ASYNC_ERROR, _bytesLoader_errorHandler); 

      try 
      { 
       _bytesLoader.unload(); 
      } 
      catch (e:*){} 

      _bytesLoader = null; 
     } 

     private function _bytesLoader_completeHandler(event:Event):void 
     { 
      try 
      { 
       myImage.source = Bitmap(_bytesLoader.content).bitmapData.clone(); 
      } 
      catch (e:*) 
      { 
      } 
      _destroyBytesLoader(); 
     } 

     private function _bytesLoader_errorHandler(event:Event):void 
     { 
      _destroyBytesLoader(); 
     } 

     ]]></fx:Script> 

    <s:layout> 
     <s:HorizontalLayout /> 
    </s:layout> 

    <s:Image id="myImage"/> 
    <s:Label text="{data.label}" /> 

</s:MXDataGridItemRenderer> 
+0

谢谢你的帮助。我发现这个问题。它在数据库中。它不是正确的字节数组它仅适用于myImage.source = data.content – ayahya82