2016-11-23 49 views
0

我正在開發大型圖像在Flex移動的火花名單。 每個ItemRenderer都有一個大的圖像。柔性手機 - 性能火花與ItemRenderers具有大圖像

這樣子。

<s:ItemRenderer> 
    ... 
    <s:BitmapImage source="{data.bmpData}" /> 
</s:ItemRenderer> 

在dataProvider中,存在名爲「bmpData」的BitmapData。

問題是滾動時的性能。 滾動時,它在呈現新圖像時停止了一段時間。

請幫我。

回答

1

如果問題是您在同一時間渲染了太多的位圖數據,您可以在不同的幀中逐一渲染它們。

下面是一個例子。 創建自定義的ItemRenderer

class YourItemRenderer 
{ 

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

       yourBitmapImage.source = null; 

       //when the data change, don't call the render function directly 
       EnterFrameManager.getInstance().addRenderFunction(render) 
     } 
    } 

    private function render():void 
    { 
     if (yourBitmapImage != null && data != null) 
     { 
      yourBitmapImage.source = data.bmpData; 
     } 
    } 
} 

EnterFrameManager用來控制渲染功能。

class EnterFrameManager 
{ 
     import mx.core.FlexGlobals; 

     public function EnterFrameManager() 
     { 
      FlexGlobals.topLevelApplication.addEventListener(Event.EnterFrame, onEnterFrameHandler)   
     } 

     private var _instance:EnterFrameManager; 

     public static function getInstance():EnterFrameManager 
     { 

      if (_instance == null) 
      { 
        _instance = new EnterFrameManager(); 
      } 

      return instance; 
     } 

     //save the render functions 
     private var renderQueue:Array = []; 

     private var nowIntervalFrame:int = 0; 

     //change it to small value when you don't feel lag 
     private const UPDATE_INTERVAL_FRAMES:int = 6; 

     private function onEnterFrameHandler(e:Event):void 
     { 
       nowIntervalFrame++; 

       if (nowIntervalFrame >= UPDATE_INTERVAL_FRAMES) 
       { 
        nowIntervalFrame = 0; 

        //change renderQueue by waitQueue 
        for each (var f:Function in waitQueue) 
        { 
         addFunctionToQueue(f, renderQueue); 
        } 

        waitQueue.length = 0; 

        if (renderQueue.length > 0) 
        { 
         var f:Function = renderQueue.shift(); 

         f(); 
        } 
       } 
     } 

     private var waitQueue:Array = []; 

     public function addRenderFunction(f:Function):void 
     { 
      addFunctionToQueue(f, waitQueue); 
     } 

     private function addFunctionToQueue(f:Function, queue:Function):void 
     { 
      var index:int = queue.indexOf(f); 

      if (index == -1) 
      { 
       queue.push(f); 
      } 
      else 
      { 
       var temp:Function = queue.splice(index, 1); 

       queue.push(temp); 
      } 
     } 

}