这个问题涉及: CS5闪存+ AS3
你好,
我只是试图在以下链接中模拟崩溃/扩展功能:http://static.geewax.org/checktree/index.html
表单本身不需要是功能性的。
这是我的第一个AS3项目,我相信我把事情搞得太复杂了,代码变得非常疯狂,我一直沉浸在其中。我试着为重复的事情做某些功能,但我所有的尝试都失败了。
我所能做到的是:
我的问题,
当第一节展开/折叠时,我找不到一种可行的方法来重新定位第二部分下面的复选框。我基本上需要这些复选框总是位于第二节。
这是我的代码:
stop();
import fl.controls.CheckBox;
import fl.controls.RadioButton;
//General Variables
var i:int;
// Tab1 Group 1
var tab1_gp1_main:CheckBox = new CheckBox();
addChild(tab1_gp1_main);
tab1_gp1_main.move(0, 20);
tab1_gp1_main.width = 120;
tab1_gp1_main.label = "Landscape";
// Tab1 Group 2;
var tab1_gp2_main:CheckBox = new CheckBox();
addChild(tab1_gp2_main);
this.tab1_gp2_main.move(0, 20 + tab1_gp1_main.y );
tab1_gp2_main.width = 120;
tab1_gp2_main.label = "Performance";
// Section Click Listeners
tab1_gp1_main.addEventListener(MouseEvent.CLICK, sectionHandler);
tab1_gp2_main.addEventListener(MouseEvent.CLICK, sectionHandler);
//Declare Number of Options;
var tab1_grp1_Options:int = 4;
var tab1_gp1_op_Labels:Array = ["Test1","Test2","Test3","Test4","Test5"];
var tab1_grp2_Options:int = 4;
var tab1_gp2_op_Labels:Array = ["Test1","Test2","Test3","Test4","Test5"];
//Section Click Functions;
function sectionHandler(event:MouseEvent):void
{
switch (event.currentTarget)
{
case tab1_gp1_main :
switch (tab1_gp1_main.selected)
{
case true :
for (i=0; i<=tab1_grp1_Options; i++)
{
//Option Creation Loop
var tab1_gp1_op:CheckBox = new CheckBox();
tab1_gp1_op.name = "tab1_gp1_op" + i;
addChild(tab1_gp1_op);
//Add Properties for Options
tab1_gp1_op.label = tab1_gp1_op_Labels[i];
tab1_gp1_op.width = 120;
//Position 1st Option Below Main
if (tab1_gp1_op.name == "tab1_gp1_op0")
{
tab1_gp1_op.move(20, 20 + this.tab1_gp1_main.y);
}
else
{
//Position Options > 1st below it
var prevOptionNum:int = i - 1;
var prevOption:CheckBox = getChildByName("tab1_gp1_op" + prevOptionNum) as CheckBox;
tab1_gp1_op.move(20, 20 + prevOption.y);
}
//Testing
trace(tab1_gp1_op.name);
trace(tab1_gp1_op.label);
trace(tab1_gp1_op.y);
}
ExpandCollapse("tab1_gp1_main_selected");
break;
default :
//Remove all options for a section
for (i=0; i<=tab1_grp1_Options; i++)
{
var RemoveOption:CheckBox = getChildByName("tab1_gp1_op" + i) as CheckBox;
trace("unselected"+RemoveOption);
removeChild(RemoveOption);
}
ExpandCollapse("tab1_gp1_main_unselected");
}
break;
case tab1_gp2_main :
switch (tab1_gp2_main.selected)
{
case true :
for (i=0; i<tab1_grp2_Options; i++)
{
//Option Creation Loop
var tab1_gp2_op:CheckBox = new CheckBox();
tab1_gp2_op.name = "tab1_gp2_op" + i;
addChild(tab1_gp2_op);
//Add Properties for Options
tab1_gp2_op.label = tab1_gp2_op_Labels[i];
tab1_gp2_op.width = 120;
//Position 1st Option Below Main
if (tab1_gp2_op.name == "tab1_gp2_op0")
{
tab1_gp2_op.move(20, 20 + tab1_gp2_main.y);
}
else
{
//Position Options > 1st below it
var tab1_gp2_op_prevnum:int = i - 1;
var tab1_gp2_op_prevopt:CheckBox = getChildByName("tab1_gp2_op" + tab1_gp2_op_prevnum) as CheckBox;
tab1_gp2_op.move(20, 20 + tab1_gp2_op_prevopt.y);
}
//Testing
trace(tab1_gp2_op.name);
trace(tab1_gp2_op.label);
trace(tab1_gp2_op.y);
}
break;
default :
//Remove all options for a section
for (i=0; i<tab1_grp2_Options; i++)
{
var tab1_gp2_op_remove:CheckBox = getChildByName("tab1_gp2_op" + i) as CheckBox;
trace("unselected"+tab1_gp2_op_remove);
removeChild(tab1_gp2_op_remove);
}
}
break;
}
}
function ExpandCollapse(SectionClicked:String):void
{
switch (SectionClicked)
{
case "tab1_gp1_main_selected" :
var lastOption:CheckBox = getChildByName("tab1_gp1_op" + tab1_grp1_Options) as CheckBox;
tab1_gp2_main.move(0, 20 + lastOption.y);
break;
case "tab1_gp1_main_unselected" :
tab1_gp2_main.move(0, 20 + tab1_gp1_main.y);
break;
default :
}
}
提前谢谢你。
发布于 2011-04-07 19:52:08
我认为它会帮助你把这个问题看作是一个清单,可以是“无限”项,并且有“无限”层次的嵌套。现在,这里有很多硬编码的数字和文本,你的间距都是以非常严格的方式设定的。要想从无限列表的角度来考虑这一点,您可以从适用于每个展开和折叠级别的规则开始。
Y
像素。X
。在这里,您可以想象列表中的每一项也是一组项(该组中的项是一组项(以及该组中的项.))。这就是所谓的复合设计模式。如果要为一行项创建一种方法来包含其中的子项,也许可以通过使每个子项目成为一个具有子显示对象的sprite,那么您可以很容易地获得组的高度(展开或折叠),并将其作为一个单元处理。当组被展开时,子对象被添加到组中(使用addChild
),当它被折叠时,它们被移除(removeChild
)。
通过创建一个表示核对表行的新类,它将帮助您将这些项封装在更小的包中,以便更容易地处理包,这样您就不会在标签和复选框中到处移动,而只是一个一行项/组。该组可以包含一行项对象的列表,而行项对象又可以包含更多的列表。不管功能有多深,功能或多或少都是一样的。
我意识到这一切更多的是对面向对象编程的介绍,而不是一个直接的答案,但是学习这些东西会在很大程度上带来回报。总之,您发布的代码试图根据具体情况将这些对象强制放到特定位置,我认为答案是尝试创建能够根据您设置的规则来适应情况的对象。
https://stackoverflow.com/questions/5022788
复制相似问题