2012-11-09 18 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