Почему вызывается средство визуализации элементов REMOVED_FROM_STAGE - PullRequest
0 голосов
/ 01 августа 2011

Я публикую пример средства визуализации элементов для используемого TileList. Я разбил его на очень простой рендерер.
Вот следы, которые я получаю, когда запускаю его.
1) createChildren называется
2) commitProperties называется
3) removeFromStage вызывается

Я не уверен, почему вызывается removeFromStage, но, посмотрев очевидно, ListBase удаляет его по некоторым причинам.
Что я действительно хочу сделать в конечном результате, так это остановить загрузку изображения, когда оно прокручивается из списка, очевидно, я не могу использовать событие REMOVED_FROM_STAGE, поскольку оно вызывается во время инициализации списка.
Причина всего этого заключается в том, что, когда у меня есть несколько сотен элементов в списке, и у каждого элемента может быть до 9 изображений.
Когда пользователь прокручивает до 3/4 пути вниз, происходит большая задержка, пока пиктограммы не нагонят загрузку.
Я надеялся, что REMOVED_FROM_STAGE позволит мне обнулить свойство image.source или что-то еще, но это невозможно.

Технически, насколько я понимаю, средство визуализации никогда не перемещается в положение, в котором перемещаются данные и содержимое.

Итак, я думаю, что я действительно спрашиваю, есть ли способ оптимизировать код, чтобы я мог остановить загрузку изображений или любые другие идеи, чтобы сделать прокрутку более эффективной?

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" >
  <mx:Script>
    <![CDATA[
      import mx.controls.Image;

      override public function set data(val:Object):void{
        super.data = val;
        if( !this.thumbnailContainer ){
          return;
        }
        if( !val ){
          return;
        }

        if( this.data.images.length != this.thumbnailContainer.numChildren ){
          this.createChildren();
        }
      }
      override protected function createChildren():void{
        super.createChildren()
        if( this.data == null ){
          return;
        }
        for( var i:int = 0; i < this.data.images.length;i++){
          var thumbnail:Image = new Image();
          thumbnail.addEventListener(Event.COMPLETE, onLoad );
          thumbnail.addEventListener(Event.REMOVED_FROM_STAGE, removeFromStage );
          var p:Panel = new Panel( );
          p.addChild( thumbnail )
          p.height = 120
          p.verticalScrollPolicy = 'off';
          p.horizontalScrollPolicy = 'off';
          thumbnailContainer.addChild( p )
        }
      }

      override protected function commitProperties():void{
        super.commitProperties();
        for( var i:int = 0 ;i<this.data.images.length;i++){
          var p:Panel = (this.thumbnailContainer.getChildAt(i) as Panel)
          var img:Image = (p.getChildAt(0) as Image)
          img.source = this.data.images[i].src
        }
      }

      private function removeFromStage( e:Event ):void{
        trace('removeFromStage')
      }

      private function onLoad( e:Event ):void{
        trace('onLoad')
        var img:Image = e.currentTarget as Image;
        var scale:Number = (img.parent.height - 50) / img.contentHeight;
        img.scaleX = scale;
        img.scaleY = scale;
      }
    ]]>
  </mx:Script>

<mx:HBox id="thumbnailContainer" />

Ответы [ 2 ]

0 голосов
/ 02 августа 2011

Я знаю, что Flex удаляет (и сразу читает) все средства визуализации элементов компонента списка со сцены, когда он начинает отображать полосы прокрутки.Я столкнулся с этим вопросом год назад.

0 голосов
/ 01 августа 2011

У меня есть некоторые оговорки о том, что происходит в вашем itemrenderer. Я новичок, когда дело доходит до реализации жизненного цикла, но я не буду беспокоиться о данных во время функции createChildren (), я бы справился с этим в функции set data.

override public function set data( value:Object ):void

Вы также, кажется, жестоко манипулируете некоторыми mx: Image в вашем рендерере. Если у меня есть средство визуализации с изображением, я делаю свое изображение компонентом mxml (если средство визуализации находится в формате mxml) и просто манипулирую источником с помощью функции набора данных, которую я переопределяю.

Я думаю, что некоторые из ваших проблем могут быть связаны с вашей реализацией жизненного цикла, которая гораздо менее прощающа для обработчиков элементов по сравнению с другими компонентами, потому что обработчики элементов перерабатываются.

Я снова посмотрел на ваш код, похоже, у вас есть какой-то список изображений в вашем списке предметов, вы когда-нибудь задумывались об использовании TileList? Вы говорите, что ваш

...