2012-11-09 17 views
0

我有一个HGroup,我想将元素拖放到上面。为了塑造HGroup,它实际上是一个拥有Rect和HGroup的组织。Flex HGroup中的拖动区域小于组本身

此代码中的阻力区域只是作为目前该组中的元素一样大(这就是为什么我摆在那里一个按钮对其进行测试)。正如你所看到的,我已经手动设置了组和HGroup的宽度。一切都报告自己的宽度应该是300,但是阻力面积仍然与HGroup中的元素数量一样大。这让我觉得HGroup实际上并不是它报告的内容(它在设置后会报告300访问.width属性)。 Rect适当地宽300,所以我可以看到拖放区应该是什么。

我觉得我必须做一些很显然是错误的,但我不能看到它。任何想法将非常感激!

编辑:我不知道是否有某种掩蔽问题。在矩形上添加一个拖动输入事件(我知道这是正确的大小,因为我可以看到它)也不会导致输入事件触发。我怎么能找到这个?

package components 
{ 
    import mx.core.IUIComponent; 
    import mx.events.DragEvent; 
    import mx.graphics.SolidColor; 
    import mx.managers.DragManager; 

    import spark.components.Group; 
    import spark.components.HGroup; 
    import spark.components.VGroup; 
    import spark.primitives.Rect; 


    public class TestVerticalConstraintExpression extends Group 
    { 
     private var expressions:VGroup; 
     private var topExpression:Group; 
     private var locked:Boolean = false; 

     public function TestVerticalConstraintExpression() 
     { 
      super(); 

      this.width = 300; 

      expressions = new VGroup(); 
      expressions.width = 300; 

      this.addElement(getBackground()); 

      topExpression = new HGroup(); 

      expressions.addElement(topExpression); 

      this.addElement(getBackground()); 
      this.addElement(expressions); 

      topExpression.width = 300; 
      topExpression.height = 50; 
      topExpression.addElement(new ConstraintButton()); 

      // Setup listeners for when things are dropped onto the expression group 
      topExpression.addEventListener(DragEvent.DRAG_ENTER, 
       dragEnterHandler); 
     } 

     protected function getBackground():Rect 
     { 
      var bg:Rect = new Rect(); 
      bg.fill = new SolidColor(Math.round(Math.random()*0xFFFFFF)); 
      bg.left = 0; 
      bg.right = 0; 
      bg.top = 0; 
      bg.bottom = 0; 
      bg.percentWidth = 100; 
      bg.percentHeight = 100; 

      return bg; 
     } 

     protected function dragEnterHandler(event:DragEvent):void { 
      DragManager.acceptDragDrop(event.currentTarget as IUIComponent); 
     } 
    } 
} 

回答

1

A Group本质上只是一个布局容器。它没有图形元素无论如何,因此它除了是完全透明的,你已经把你的ConstraintButton,这就是为什么你只能在HGroup拖放到该ConstraintButton和其他地方。

所以,你必须创建一个“hitzone”与具有尺寸为您HGroup相同的图形元素。它可能会将其alpha属性设置为0,以便您不会看到它,但仍可以与其交互。我能想到的两种最简单的方法:

  • 转换您HGroupBorderContainerHorizontallayout
  • HGroupGroup与背景Rect在一起;是这样的:

<s:Group id="topExpression"> 
    <s:Rect left="0" right="0" top="0" bottom="0"> 
     <s:fill> 
      <s:SolidColor alpha="0" /> 
     </s:fill> 
    </s:Rect> 

    <s:HGroup id="yourOldTopExpression" left="0" right="0" top="0" bottom="0" /> 
</s:Group> 

这就是说,你为什么要编写ActionScript中的 “查看”?它使得代码更加冗长(即更多的工作)并且更难以阅读。更不用说你犯了错误,比如将背景Rect两次添加到主要的Group,如果你的代码是用MXML编写的,你会立即发现它。
也许更重要的是:因为你把子创建代码在主类的构造函数,你的代码实际上会导致性能损失。如果您想在纯ActionScript中编写组件,您必须了解并理解Flex组件的生命周期。 MXML为您处理所有这些细节。
如果您担心混合使用MXML和ActionScript,则应该阅读Spark皮肤架构。 (作为一个例子,你可以看看这个使用Spark皮肤的答案:Custom Composite Control not rendering correctly for only 0.5-1 sec after being added back into a VGROUP)。

+0

我刚刚开始使用AS,并且对MXML文件和组件如何相互关联感到困惑,但您非常正确,我正要将此重构为MXML!感谢你的回答,把这个组合放在组里看起来应该很棒。 – cflewis