2016-11-23 3 views
0

Я разрабатываю список искры с большими изображениями в flex mobile. У каждого ItemRenderer есть большое изображение.flex mobile - performance of spark Список с ItemRenderers, который имеет большое изображение

такой.

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

В dataProvider есть BitmapData как имя "bmpData".

Проблема в производительности при прокрутке. При прокрутке он некоторое время останавливается при визуализации нового изображения.

помогите мне пожалуйста.

ответ

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); 
      } 
     } 

}