首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flash表单:展开/合同部分-我的AS3代码正在疯狂运行。需要建议

Flash表单:展开/合同部分-我的AS3代码正在疯狂运行。需要建议
EN

Stack Overflow用户
提问于 2011-02-16 22:12:56
回答 1查看 929关注 0票数 0

这个问题涉及: CS5闪存+ AS3

你好,

我只是试图在以下链接中模拟崩溃/扩展功能:http://static.geewax.org/checktree/index.html

表单本身不需要是功能性的。

这是我的第一个AS3项目,我相信我把事情搞得太复杂了,代码变得非常疯狂,我一直沉浸在其中。我试着为重复的事情做某些功能,但我所有的尝试都失败了。

我所能做到的是:

  1. 动态地从数组中创建checkboxes+labels,并将它们正确地放置在彼此之间。
  2. 单击“区段”,会导致复选框出现/消失
  3. 点击第一节,自动重新定位第二节正确。

我的问题,

当第一节展开/折叠时,我找不到一种可行的方法来重新定位第二部分下面的复选框。我基本上需要这些复选框总是位于第二节。

这是我的代码:

代码语言:javascript
运行
复制
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 :
    }
}

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-07 19:52:08

我认为它会帮助你把这个问题看作是一个清单,可以是“无限”项,并且有“无限”层次的嵌套。现在,这里有很多硬编码的数字和文本,你的间距都是以非常严格的方式设定的。要想从无限列表的角度来考虑这一点,您可以从适用于每个展开和折叠级别的规则开始。

  • 每个项目显示在前一组项下面的Y像素。
  • 每个子组出现在父组右侧的X
  • 当一群人崩溃时,里面的孩子就会被藏起来。
  • 父项包含其所有子项。

在这里,您可以想象列表中的每一项也是一组项(该组中的项是一组项(以及该组中的项.))。这就是所谓的复合设计模式。如果要为一行项创建一种方法来包含其中的子项,也许可以通过使每个子项目成为一个具有子显示对象的sprite,那么您可以很容易地获得组的高度(展开或折叠),并将其作为一个单元处理。当组被展开时,子对象被添加到组中(使用addChild),当它被折叠时,它们被移除(removeChild)。

通过创建一个表示核对表行的新类,它将帮助您将这些项封装在更小的包中,以便更容易地处理包,这样您就不会在标签和复选框中到处移动,而只是一个一行项/组。该组可以包含一行项对象的列表,而行项对象又可以包含更多的列表。不管功能有多深,功能或多或少都是一样的。

我意识到这一切更多的是对面向对象编程的介绍,而不是一个直接的答案,但是学习这些东西会在很大程度上带来回报。总之,您发布的代码试图根据具体情况将这些对象强制放到特定位置,我认为答案是尝试创建能够根据您设置的规则来适应情况的对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5022788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档