2012-05-16 19 views
1

我有一個通用的應用程序,其中一個部分就是用戶必須拖動一個或多個項目的鍛鍊(文字爲主,但圖像可能是可能的)和如下所示將其放入一個盒子中。手動拖放在Flex 4中,同時避免與其他拖拽元素碰撞

http://eastblue.org/dragdropexample.png

盒子是BorderContainer自定義子類。 每個可拖動的項目(的RichText一個子類)被使用startDrag()MouseEvent.MOUSE_DOWN回升。當它在MOUSE_UP上獲得釋放時,它會使用this.hitTestObject(box)檢查它是否碰到該框,如果它沒有命中,則將動畫恢復到開始位置。如果它確實打了,我們做

stopDrag(); 
this.x = e.stageX; // e is the MouseEvent 
this.y = e.stageY; 

它工作得很好。這種方法的問題在於可拖動的物品可能相互碰撞,而且看起來不太漂亮。

我想避免拖動項目在相互碰撞,並在同一時間確保它們保持箱內。

我認爲有兩種方式解決這個:

  • 創建某種箱內電網,確保各個網格大到足以容納最大可拖動項目,有項目出現在最接近的免費網格廣場。

    問題在於盒子和每個可拖動的項目可以是任意大小,並且可以有任意數量的可拖動項目,所以確保用戶可以將每個項目放入盒子內有點麻煩,如果他想要並仍然保持它看起來沒問題。

  • 檢查每個被丟棄的物品是否已經落入該物品的所有其他物品中,如果它們發生碰撞,請將新丟棄的物品移動到其中一個方向上,直到它們不再相互碰撞。

    這裏的問題是藏在心裏的盒子裏面,而不是被陷在一個循環試圖在一個不可能的方向移動。而如果沒有辦法可以將移動?

我錯過了一些明顯的方法,或者更簡單的方法嗎?如果不是,我該如何儘可能簡單地實現?

有些碰撞可能是正確的,因爲用戶將無法與這些練習一個花費太多的時間,但是現在的工作方式他們幾乎似乎求得對方出來,可怕的崩潰。

回答

2

使用FlexManager中所記錄的DragManager。只接受你的BorderContainer的接受代碼。然後製作BorderContainer的項目子項,並給它一個你想要的佈局。

+0

我最終加入了'Scroller'包裝一'Group'的'BorderContainer'內,給予該'Group'一個'TileLayout'。然後將拖動的項目添加到「組」中,從而獲得相當不錯的結果。 不太喜歡滾動條,或者當我拖入或滑出某些東西時,有時會調整大小,但當我事先不知道大小時,我想這很難避免。 – PerfectlyNormal