为什么要调用Item渲染器调用REMOVED_FROM_STAGE

时间:2011-08-01 16:19:58

标签: flex actionscript-3 flex3

我正在为我正在使用的TileList发布示例项呈示器。我把它分解成一个非常基本的渲染器 这是我运行时得到的痕迹 1)createChildren被称为
2)commitProperties被称为
3)removeFromStage被称为

我不确定为什么removeFromStage被调用,但看起来很明显ListBase因某种原因删除了它。
我最终想要做的就是当它从列表中滚动时停止图像加载,显然我不能使用REMOVED_FROM_STAGE事件,因为这会在列表的init期间被触发。
这一切的原因是因为当我在列表中有几百个项目时,每个项目最多可以有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 :(得分:0)

我对您的itemrenderer中发生的事情有所保留。在生命周期实现方面我是新手,但我不担心createChildren()函数中的数据,我会在set数据函数中处理它。

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

你似乎也在你的渲染器中猛烈地处理一些mx:Image。如果我有一个带有Image的渲染器,我将我的Image设置为mxml组件(如果渲染器是mxml),并通过我覆盖的set数据函数操作源。

我认为您的一些问题可能是由于您的生命周期实施,与其他组件相比,对于itemrenderers的原因要少得多,因为itemrenderers会被回收。

我再次查看了你的代码,似乎你在itemrenderers列表中有某种图像列表,你有没有考虑过使用TileList? 你说你的

答案 1 :(得分:0)

我知道当Flex开始显示滚动条时,Flex会从舞台中移除(并立即读取)列表组件的所有项目渲染器。我在一年前遇到过这个问题。