【问题标题】:AS3: Who should I layout first the parent or the children?AS3:我应该先布局父母还是孩子?
【发布时间】:2014-03-09 07:11:19
【问题描述】:

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

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

默认情况下,Sprite 将根据他的孩子添加到舞台后获得他的大小。

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

在这种情况下,我应该:

  1. 添加孩子
  2. 确定它们的大小。如果您要跨平台构建应用程序,则需要支持许多屏幕,并且很多时候您会遇到复杂的逻辑来计算组件的缩放百分比,即它们的大小。
  3. 自行确定尺寸和布局。
  4. 现在底部菜单可以在距底部 20 像素处进行布局。此外,将此逻辑放在底部菜单中还是它的父级也没关系。

但情况并非总是如此,有时您希望根据其子级来布局父级。如果其中一个孩子是父母背景,这是一个常见的例子。在这种情况下,您应该:

  1. 添加背景。
  2. 确定背景大小并对其进行布局。
  3. 现在您可以布局父级了。

但是如果我得到了这两个案例呢?如果父子之一是背景,另一个是底部菜单?如果底部菜单有他自己的背景和其他需要根据父级布局的子级怎么办?

可以使用什么解决方案,这样我就不会迷失在这一切之中,Gazman SDK 可以在这里提供帮助吗?

【问题讨论】:

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


    【解决方案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
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      相关资源
      最近更新 更多