2013-03-29 27 views
1

enter image description here列表的itemRenderer拖过检测

由于PIC所示,假设物品1拖动列表1项IV的列表2,我想这个项目IV检测拖过状态和hightlight本身,因此如何实现的呢?

+1

一个确切的回答你的问题在于,在http://www.davidortinau.com/blog/catch_mouseover_event_when_dragging_another_object/ – Ihsan

回答

1

将一个MouseEvent.MOUSE_OVER侦听器附加到每个列表元素,用于检查是否拖动任何内容,如果是,则event.target被突出显示。

+0

它不适合这种情况。我只希望当List1项目拖动它时,List2的项目会突出显示。如果附加MouseEvent.MOUSE_OVER,则即使未由拖动行为触发,List2的项目也会突出显示。 – jason

+0

@Vesper,这是我的解决方案。在List2中,我侦听DRAG_OVER和DRAG_DROP事件,在事件处理程序中计算drop index,使用layout.target.getElementAt()获取List项目,然后调用item.highlight()。但是我遇到了另一个问题,如果在仍然拖拽时(例如,从项目iv到项目iii)更改拖放项目,如何撤消之前的项目高亮? – jason

+0

@Allan,你可以看看最新的评论吗? – jason

0

这里是我的解决方案和代码: 为列表2

<s:List 
itemRenderer="components.MyRenderer" 
dragEnter="myDragEnterHandler(event)" 
dragOver="myDragOverHandler(event)" 
dragExit="myDragExitHandler(event)"> 
<fx:Script> 
    <![CDATA[ 
     private function myDragEnterHandler(event:DragEvent):void { 
      //we shoudld make List2 be drop target 
      DragManager.acceptDragDrop(e.currentTarget as IUIComponent);    
     } 

     private function myDragOverHandler(event:DragEvent):void { 
      var dropIndex:int = calDropIndex(event); 
      var element:MyRenderer= calDropItem(dropIndex); 
      //undo highlight if there is last over item 
      if(lastOverItem) { 
       lastOverItem.undoHighlight();    
      } 
      //remember the last highlight one and highlight it 
      lastOverItem = element;  
      element.highlight(); 
     } 

     private function myDragExitHandler(event:DragEvent):void { 
      var dropIndex:int = calDropIndex(event); 
      var element:MyRenderer= calDropItem(dropIndex); 
      element.undoHighlight(); 
     } 

     private function calDropIndex(event:DragEvent):int { 
      var dropLocation:DropLocation = 
       event.currentTarget.layout.calculateDropLocation(event); 
      var dropIndex:int = dropLocation.dropIndex; 
      return dropIndex; 
     } 

     private function calDropItem(dropIndex:int):MyRenderer{ 
      var element:IVisualElement; 
      if (layout.useVirtualLayout) { 
      element = layout.target.getVirtualElementAt(dropIndex); 
      } else { 
      element = layout.target.getElementAt(dropIndex); 
      } 
      return element as MyRenderer; 
     } 
    ]]> 
</fx:Script> 
</S:List>