2011-07-01 12 views
0

我有一個渲染器,看起來像這樣:星火圖像消失滾動和阻力在Flex應用程序

<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"> 
    <s:Group width="160" toolTip="{data.toolTip}" doubleClickEnabled="true"> 
     <s:layout> 
      <s:VerticalLayout gap="5" horizontalAlign="center" 
           paddingBottom="2" paddingLeft="2" paddingRight="2" paddingTop="2"/> 
     </s:layout> 
     <mx:Canvas width="156" height="156" borderStyle="solid" borderColor="#AAAAAA" 
        verticalScrollPolicy="off" horizontalScrollPolicy="off"> 
      <mx:Image id="image" source="{data.thumbnail}" width="{data.thumbwidth}" height="{data.thumbheight}" 
         horizontalCenter="0" verticalCenter="0"/> 
     </mx:Canvas> 
     <s:Label text="{data.data.name}" maxDisplayedLines="2" textAlign="center" 
       width="100%"/> 
    </s:Group> 
</s:ItemRenderer> 

在看起來像這樣

<s:List id="fileIconView" 
    dataProvider="{files}" 
    width="100%" height="100%" 
    borderVisible="false" 
    dragEnabled="true" 
    allowMultipleSelection="true" 
    doubleClickEnabled="true" 
    mouseDown="fileIconViewMouseDown(event)" 
    mouseMove="fileIconViewMouseMove(event)" 
    mouseUp="clearSelectionRectangle()" 
    change="fileSelectionChanged()" 
    itemRenderer="view.ThumbnailRenderer"> 
    <s:layout> 
     <s:TileLayout clipAndEnableScrolling="true" /> 
    </s:layout> 
</s:List> 

列表當我滾動列表中的圖像消失。我該如何解決?

同樣,當我通過當拖動完成或取消再生列表拖動他們中的一個,但我固定的(部分地)發生。

UPDATE 2011年7月11日,下午2時02 EST 數據對象被髮送到渲染器看起來像這樣

[Bindable] 
public class FileWrapper 
{ 
    /** file that wrapper holds, File, OnlineDocument and SymbolicLinks */ 
    public var data:*; 

    /** file size */ 
    public var size:String; 

    /** file's author */ 
    public var author:String; 

    /** file's created date */ 
    public var date:String; 

    /** tooltip for the file */ 
    public var toolTip:String; 

    /** image */ 
    public var img:String; 

    /** thumbnail source */ 
    public var thumbnail:Object; 

    /** width of thumbnail image */ 
    public var thumbwidth:int; 

    /** height of thumbnail image */ 
    public var thumbheight:int; 

    /** folder with mime type icons */ 
    public const MIME_ICONS_FOLDER:String = "fileexplorer/mimeTypeIcons/"; 

    public function FileWrapper(file:*, controller:FileExplorerController) 
    { 
     this.data = file; 

     if (file is File) { 
      var f:File = file as File; 
      this.size = NumberUtils.humanReadableBytes(f.latestRevision.sizeOnDisk); 
      this.author = f.latestRevision.author.displayName; 
      this.date = NumberUtils.formatDate(f.latestRevision.timeUploaded); 
      this.toolTip = f.name + "\n" +"Size: " + this.size 
       + "\n" + "Type: " + f.latestRevision.mimeType; 
      this.img = MIME_ICONS_FOLDER+getMimeTypeIcon(f.latestRevision.mimeType); 

      var self:FileWrapper = this; 
      controller.getThumbnail(f.latestRevision, 
       function (tumbnailBitmap:Object):void 
       { 
        self.thumbnail = tumbnailBitmap; 
        self.thumbwidth = tumbnailBitmap.width; 
        self.thumbheight = tumbnailBitmap.height; 
       }); 
     } 
     else if(file is OnlineDocument) { 
      this.toolTip = file.name + "\nOnline Document"; 
      this.img = MIME_ICONS_FOLDER+"OnlineDocument.png"; 
     } 
     else if(file is SymbolicFileLink) { 
      this.toolTip = file.name + "\nShortcut"; 
      this.img = MIME_ICONS_FOLDER+"System-Shortcut-icon.png"; 
     } 
     else { 
      this.size = ""; 
      this.author = ""; 
      this.date = ""; 
      this.toolTip = "Unknown File Type"; 
      this.img = MIME_ICONS_FOLDER+"Unknown.png"; 
     } 
     this.thumbnail = this.img; 
     this.thumbwidth = 32; 
     this.thumbheight = 32; 
    } 

    /** 
    * Gets the icon image for the given mime type 
    * 
    * @param mime type string 
    * @return image name string 
    */ 
    protected static function getMimeTypeIcon(mimeType:String):String 
    { 
     switch (mimeType) { 
      case "application/msword": 
       return "File-doc.png"; 
      case "application/octet-stream": 
       return "System-binary.png"; 
      case "application/ogg": 
       return "Audio-ogg.png"; 
      case "application/pdf": 
       return "File-pdf.png"; 
      case "application/vnd.ms-excel": 
       return "File-xls.png"; 
      case "application/vnd.ms-powerpoint": 
       return "File-ppt.png"; 
      case "application/x-bzip2": 
       return "Archive-zip.png"; 
      case "application/x-gtar": 
       return "Archive-tar.png"; 
      case "application/x-gzip": 
       return "Archive-gzip.png"; 
      case "application/x-tar": 
       return "Archive-tar.png"; 
      case "application/xhtml+xml": 
       return "File-html.png"; 
      case "application/zip": 
       return "Archive-zip.png"; 
      case "audio/x-mpegurl": 
       return "Audio-mp3.png"; 
      case "audio/mpeg": 
       return "Audio-mp3.png"; 
      case "audio/x-aiff": 
       return "Audio-aiff.png"; 
      case "audio/x-wav": 
       return "Audio-wav.png"; 
      case "image/bmp": 
       return "Image-bmp.png"; 
      case "image/gif": 
       return "Image-gif.png"; 
      case "image/jpeg": 
       return "Image-jpg.png"; 
      case "image/png": 
       return "Image-png.png"; 
      case "image/tiff": 
       return "Image-bmp.png"; 
      case "text/html": 
       return "File-html.png"; 
      case "text/plain": 
       return "File-txt.png"; 
      case "application/vnd.oasis.opendocument.presentation": 
       return "Presentation.png"; 
      case "application/vnd.oasis.opendocument.spreadsheet": 
       return "Spreadsheet.png"; 
      case "application/vnd.oasis.opendocument.text": 
      case "text/richtext": 
       return "Text.png"; 
      case "text/xml": 
       return "Text.png"; 
      case "video/mpeg": 
       return "Video-mpeg.png"; 
      case "video/quicktime": 
       return "Video-movie.png"; 
      case "video/vnd.mpegurl": 
       return "Video-mpeg.png"; 
      case "video/x-msvideo": 
       return "Video-avi.png"; 
      case "video/x-sgi-movie": 
       return "Video-movie.png"; 
      default: 
       return "System-default.png"; 
     } 
    } 
} 

的controller.getThumbnail方法簡單地調用該模型的方法

public function getThumbnail(revision:Revision, callBack:Function):void 
{ 
    // only for image revisions 
    if (revision.mimeType.indexOf("image") > -1) { 
     var loader:Loader = new Loader(); 
     // create request 
     var urlVars:URLVariables = new URLVariables(); 
     urlVars.authToken = userAccountModel.token; 
     urlVars.id = revision.id; 
     var req:URLRequest = new URLRequest(THUMBNAIL_URL); 
     req.data = urlVars; 

     var context:LoaderContext = new LoaderContext(true); 
     loader.load(req, context); 
     // set load handler 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
      function(event:Event):void 
      { 
       callBack(event.currentTarget.content); 
      }); 
    } 
} 

使用此方法加載縮略圖完美無缺。滾動列表時發生該問題。

+0

只需使用你提供的代碼,我無法重現的問題......你可以包括事件處理程序的源代碼(的mouseMove似乎是唯一一個我能想到可以用滾動衝突)?另外,您是否可以在「文件」中包含您綁定到List的數據樣本?我很感興趣,看看有什麼被綁定到Image.source財產 – mrk

回答

1

我的第一個懷疑看到這樣的事情時,是一個「useVirtualLayout」的問題。總而言之,當useVirtualLayout爲true(缺省值)時,可以重新使用渲染器。當渲染器被重用時,它可能會決定數據沒有真正改變,並且會錯誤地渲染圖像等東西。

我已經使用,以確保準確呈現兩種解決方法: 首先,打開useVirtualLayout爲false。這可以防止重新使用渲染器。 第二,覆蓋設置數據函數並創建您自己的私有變量來保存您顯示的數據。這還可以讓您更輕鬆地調試數據設置,並確保每次使用/重用渲染器時都能正確設置數據。

最後一個音符。這可能是完全不相關的,但我注意到更新到Flash Player 10.3後,發生這種特殊問題的頻率較低。

+0

設置「useVirtualLayout」假固定它的列表。謝謝! :D –

+0

只是發現了一些額外的信息。使用Flex 4.5.x,也許更早。當您創建自定義itemRenderer時,Adobe建議您覆蓋準備功能。唯一的參數是hasBeenRecycled,這在允許渲染器被重用時非常有用。 – ahillman3