AS3:我应该首先布置父母或孩子?

时间:2014-03-09 07:11:19

标签: actionscript-3 starling-framework gazman-sdk

我正在Starling中构建大型应用程序,我的主要问题之一是我应该首先布局:父母还是孩子?

starling和flash中的默认行为是什么:

默认情况下,Sprite会在他们的孩子加入舞台后根据他的孩子获得他的身材。

如果我想根据父级布局孩子怎么办?例如:如果我想将其中一个孩子设置在距离底部20像素的位置,如底部菜单,该怎么办?

在这种情况下,我应该:

  1. 添加孩子
  2. 确定尺寸。如果您正在构建跨平台的应用程序,则需要支持许多屏幕,并且很多时候您会有复杂的逻辑来计算组件的比例百分比,这是它们的大小。
  3. 自己确定尺寸和布局。
  4. 现在底部菜单可以从底部20像素布局。如果将此逻辑放在底部菜单或其父级中也无关紧要。
  5. 但情况并非如此,有时你想根据他的孩子布置父母。如果其中一个孩子是父母背景的常见示例。在这种情况下,你应该:

    1. 添加背景。
    2. 确定背景大小并对其进行布局。
    3. 现在您可以布置父级。
    4. 但如果我同时收到这两个案子怎么办?如果其中一个父母是背景而另一个是底层菜单?如果底部菜单有自己的背景和其他需要根据父母进行布局的孩子会怎么样?

      可以使用什么解决方案,这样我就不会迷失在所有这些内容中,Gazman SDK可以在这里提供帮助吗?

1 个答案:

答案 0 :(得分:-1)

您需要的是在所有组件之间创建布局依赖关系。每个Sprite都应该有一个事件告诉我们布局何时完成。

现在,如果在父级内部有一些布局逻辑,在其后台子级完成布局之前无法启动,则应在背景和父级之间创建依赖关系。父级应该从后台监听LayoutComplete事件,然后他可以自己布局,当他完成布局时,他可以调度LayoutComplete事件,现在它的子菜单可以自己布局。

您可以自己实施或使用完全相同的Gazman-SDK。如果您选择 Gazman-SDK ,您的代码将如下所示:

public class ParentClass extends Group
{
    private var background:Background = new Background();
    private var bottomMenu:BottomMenu = new BottomMenu();

    override protected function initialize():void
    {
        // check if not already added to stage
        if(!background.parent){ 
            addChild(background);
            addChild(bottomMenu);
        }

        // Create dependency for background. If background have not 
        // been initialized yet the subscription will succeed
        // And this.initialize() will be called again once 
        // background initialize is complete
        if (subscribeForInitilize(background)){ 
            return;
        }

        // do layouting logic here
    }

}

public class BottomMenu extends Group
{
    override protected function initialize():void
    {
        // Create dependency for parent. If parent have not 
        // been initialized yet the subscription will succeed
        // And this.initialize() will be called again once 
        // parent initialize is complete
        if (subscribeForInitilize(parent as Group)){ 
            return;
        }

        // do layouting logic here
    }

}