如何在自定义项呈示器中访问TileList项索引

时间:2011-03-04 23:37:14

标签: flex

  <mx:itemRenderer>   
     <mx:Component>   
       <mx:Canvas> 
         <mx:Image source="{outerDocument.get_img()}" scaleContent="false" />   
       </mx:Canvas>   
     </mx:Component>   
  </mx:itemRenderer>   

因此,如果我想将要呈现的列表项的索引作为参数传递给get_img,那将如何完成。感谢。

2 个答案:

答案 0 :(得分:0)

我需要索引的原因是,我正在构建一系列图像,每个单元格一个,通过迭代主图像(如Windows ImageList)并为每个单元格获取一部分主图像。我需要索引,以便在刷新单元格渲染时,它总是转到主映像中的正确位置。但我发现我可以为每个子图像创建一个ByteArray,并使其成为DataProvider中每个对象的一个​​字段。无论如何,不​​再需要&#34;索引&#34;:

<mx:TileList id="ImgList" height="{parent.height-45}" width="226" 
  maxColumns="2" rowHeight="24" columnWidth="104" x="0" y="45" 
  creationComplete="{InitImgList()}"    
>    
  <mx:Script>
    <![CDATA[

      private function InitImgList():void  {      
        var arr:Array = new Array();
        var r:Rectangle = new Rectangle(0,0,100,20);            
        var pt:Point = new Point(0,0);
        var encoder:PNGEncoder = new PNGEncoder();
        for (r.x=0; r.x<img.width; r.x+=100) {
          var bmd:BitmapData = new BitmapData(100,20,true,0);   
          bmd.copyPixels(Bitmap(img.content).bitmapData,r,pt);  
          var obj:Object = {label:"", source:encoder.encode(bmd)}         
          arr.push(obj);
        }       
        ImgList.dataProvider = arr;
      }

    ]]>
  </mx:Script>

  <mx:itemRenderer>   
     <mx:Component>   
         <mx:Canvas> 
         <mx:Image source="{data.source}" scaleContent="false" />   
       </mx:Canvas>   
     </mx:Component>   
  </mx:itemRenderer>   


</mx:TileList>  

答案 1 :(得分:0)

只是一个更新 - 使用BitmapAsset作为源而不是encoder.encode要快得多。 (没有闪烁)。但是它必须像下面这样设置。 (即每次ItemRenderer重新渲染时都需要重新创建BitmapAsset - 不要问我原因。):

  <mx:Script>
    <![CDATA[

  private var bmd_arr:Array = new Array();

  private function InitImgList():void  {      
    var arr:Array = new Array();
    var r:Rectangle = new Rectangle(0,0,100,20);            
    var pt:Point = new Point(0,0);
    for (r.x=0; r.x<img.width; r.x+=100) {
      var bmd:BitmapData = new BitmapData(100,20,false,0);      
      bmd.copyPixels(Bitmap(img.content).bitmapData,r,pt);  
      bmd_arr.push(bmd);            
      var obj:Object = {label:"",n:bmd_arr.length-1};         
      arr.push(obj);
    }       
    ImgList.dataProvider = arr;
  }

  public function get_img(n:int):BitmapAsset {
    return new BitmapAsset(bmd_arr[n]);   
  }

    ]]>
  </mx:Script>

  <mx:itemRenderer>   
     <mx:Component>   
     <mx:Canvas> 
         <mx:Image x="2" source="{outerDocument.get_img(data.n)}" scaleContent="false" />   
       </mx:Canvas>   
     </mx:Component>   
  </mx:itemRenderer>   


</mx:TileList>