昨天遇到了动态生成多个自定义控件的问题,发现自己在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、可以用如下的方法:
- var sayHello:String = "欢迎光临www.FlashJ.cn -Flash,Ria技术博客";
- btn1.addEventListener(MouseEvent.CLICK,function (e:MouseEvent){clickHandlerWithArg(e,sayHello)});
- function clickHandlerWithArg(e:MouseEvent,arg:String):void
- {
- var out:String= e.target + "发出事件(有参数) :" + arg;
- trace(out);
- }
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)值,哪位高手能够给在下解答,不胜感激。(无以为谢,赠图一张)