2016-11-23 87 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); 
      } 
     } 

}