关于flex对象数组的使用心得

昨天遇到了动态生成多个自定义控件的问题,发现自己在as3方面还不是很熟练,今天接触了flex的对象数组,研究了一天,弄出点眉目,在此与大家分享,如有错,欢迎指正。

先贴出代码:

public function addCard():void
{
 var tempRows:int = totalChapter/4;
 var Rows:int = (tempRows==0)?tempRows:(tempRows+1);
 Alert.show("行数"+Rows.toString());
 var hbArr:Array = new Array(Rows);//HBox的行数
 var chArr:Array = new Array(totalChapter);//总共产生的卡片数
    for(var i:int=0;i<Rows;i++)
    {
     var hb:HBox = new HBox();
     hb.id = "h"+i.toString();
     hb.percentWidth=100;
     hbArr[i] = hb;
     AllChap.addChild(hb);
    }
    for (var j:int = 0;j<totalChapter;j++)
    {
     var chaPic:ChapterPic = new  ChapterPic();
      chArr[j] = chaPic;
      (chArr[j].valueOf() as ChapterPic).setStyle("backgroundImage",picSource(j+1));
      //(chArr[j].valueOf() as ChapterPic).addEventListener(MouseEvent.CLICK,function (e:MouseEvent):void{toTest(e,int(j+1))});
      // xmlAr[j+1].toString();
    }
   
   for(var k:int = 0;k<Rows;k++)
   {
     if(k<Rows-1)
     { for(var m:int = 4*k;m<4*(k+1);m++)
      { 
      (hbArr[k].valueOf() as HBox).addChild(chArr[m].valueOf() as ChapterPic);//1、数组对象如何调用
            (chArr[m].valueOf() as ChapterPic).addEventListener(MouseEvent.CLICK,function (e:MouseEvent):void{toTest(e,int(m+1))});//2、传递参数
      (chArr[m].valueOf() as ChapterPic).ChName.text =xmlAr[m+1].toString();//3、自定义控件的子组件只能在addChild之后才能使用
      }
     }
     else
     {
      for(var n:int = 4*k;n<totalChapter;n++)
      {
      (hbArr[k].valueOf() as HBox).addChild(chArr[n].valueOf() as ChapterPic);
         (chArr[n].valueOf() as ChapterPic).addEventListener(MouseEvent.CLICK,function (e:MouseEvent):void{toTest(e,int(n+1))});
      (chArr[n].valueOf() as ChapterPic).ChName.text =xmlAr[m+1].toString();
      }
     }
   }

 Alert.show("创建教程图片");
 
}

关键语句:

1、 (hbArr[k].valueOf() as HBox).addChild(chArr[m].valueOf() as ChapterPic);//1、数组对象如何调用
     思考:把数组单元指向一个具体的object的时候,下次如何调用?

    解答:1)、as3中array类提供了valueOf() 函数,他的返回值就是该数组所指向的对象;

             2)、利用as对提取的对象进行转换,即可调用到该索引位置指向的对象了。

2、  (chArr[m].valueOf() as ChapterPic).addEventListener(MouseEvent.CLICK,function (e:MouseEvent):void{toTest(e,int(m+1))});//2、传递参数

    思考:利用事件监听如何传递除事件本身额外的参数?
   解答:1)、这种问题有种解决方法:

                   a、自定义事件类型,添加事件属性(可谷歌到);

                   b、可以用如下的方法:            

  1. var sayHello:String = "欢迎光临www.FlashJ.cn -Flash,Ria技术博客";
  2. btn1.addEventListener(MouseEvent.CLICK,function (e:MouseEvent){clickHandlerWithArg(e,sayHello)});
  3. function clickHandlerWithArg(e:MouseEvent,arg:String):void
  4. {
  5. var out:String= e.target + "发出事件(有参数) :" + arg;
  6. trace(out);
  7. }

3、    (chArr[m].valueOf() as ChapterPic).ChName.text =xmlAr[m+1].toString();//3、自定义控件的子组件只能在addChild之后才能使用

思考:当我把这句话放在addchild语句之前的时候,就无效,为什么?

解答:因为自定义控件中的子控件的属性是在createchildren事件之后才可使用,所以只有在添加完成之后,才可以设置子控件的可见属性。

        详细请查阅flex控件的生命周期资料。

目前还有一个问题没有解决,代码中的红色背景区域,我给对象数组中的每个对象添加事件监听,本来是想给chArr[m]添加toTest(e,int(m+1)),但最后的结果是每个对象都添加的最后一次的(m+1)值,哪位高手能够给在下解答,不胜感激。(无以为谢,赠图一张)


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值