Flex 如何获得Tree 拖动节点的起始位置

测试页面

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
 <fx:Declarations>
  <!-- 将非可视元素(例如服务、值对象)放在此处 -->
 </fx:Declarations>
 <fx:Script>
  <![CDATA[
   import mx.collections.ArrayCollection;
   import mx.core.DragSource;
   import mx.events.DragEvent;
   [Bindable]
   private var treeData:Object =
    {
     "name":"根节点",
     "value":"root",
     children:[
      {
       "name":"子1","value":1,
       "children":
       [
        {"name":"子11","value":11}
        ,{"name":"子12","value":12}
       ]
      }
      ,{
       "name":"子2","value":2,
       "children":
       [
        {"name":"子21","value":21}
        ,{"name":"子22","value":22}
       ]
      }
      ,{"name":"子3","value":3}
     ]
    };
   
   private var dragItems:Array=null;
   
   /**
    * 用户在放置目标上释放鼠标时由放置目标分派。
    可以使用此事件处理函数将拖动数据添加到放置目标。
    */
   protected function tree1_dragDropHandler(event:DragEvent):void
   {
    // TODO Auto-generated method stub
    //event.preventDefault();
    var tree:Tree = event.target as Tree;//树控件
    var draggedFormat:String = event.dragSource.formats[0];      
    var draggedItems:Array = event.dragSource.dataForFormat(draggedFormat) as Array;    
    var dropIndx:int = tree.calculateDropIndex(event);    
    var dragParm:DragParam = new DragParam();
    getDragParam(draggedItems,tree.dataProvider[0],dragParm);    
    
    tips.text = "dragged Item:"+draggedItems[0].name+
     "\n from  parent: "+dragParm.parent.name+"\n"+
     "from  childindx: "+dragParm.indx;
    
    dragItems = draggedItems;
    
   }
   
   /**
    * 在拖动操作完成时(将拖动的数据放到放置目标时或在没有执行放置操作的情况下结束拖放操作时)
    * 由拖动启动器(作为要拖动的数据源的组件)分派。
    */
   protected function tree1_dragCompleteHandler(event:DragEvent):void
   {
    if(dragItems!=null)
    {
     var tree:Tree = event.target as Tree;//树控件
     var dragParm:DragParam = new DragParam();
     getDragParam(dragItems,tree.dataProvider[0],dragParm);    
     
     tips.text += "\nto  parent: "+dragParm.parent.name+"\n"+
      "to  childindx: "+dragParm.indx;
    }
   }
   
   private function getDragParam(dragItems:Array,datasouce:Object,dragParam:DragParam):void
   {
    var dragItem:Object = dragItems[0];    
    if(dragItem.value == datasouce.value)//根节点
    {
     dragParam.indx = -1;
     dragParam.parent = null;
     return ;
    }
    
    if(("children" in datasouce)==false)
     return ;
    
    for(var i:int = 0 ;i<datasouce.children.length;i++)
    {
     var child:Object = datasouce.children[i];
     if(child.value == dragItem.value)
     {
      dragParam.indx = i;
      dragParam.parent = datasouce;
      break;
     }
     getDragParam(dragItems,child,dragParam);
    }
    
   }
   

   
  ]]>
 </fx:Script>
 <s:HGroup width="100%">
  <mx:Tree id="testTree" width="200" height="400" dragMoveEnabled="true"
     dropEnabled="true"
     dataProvider="{treeData}" dragEnabled="true"
     labelField="name"
     dragDrop="tree1_dragDropHandler(event)"
     dragComplete="tree1_dragCompleteHandler(event)"
     >
  </mx:Tree>
  <s:Label  id="tips" width="200" />
 </s:HGroup>
 
  
 
</s:Application>

 辅助类 用处不大

package
{

	public class DragParam
	{
		public function DragParam()
		{
		}
		
		
		public var parent:Object;
		
		public var indx:int = -1;
		
		
	}
}

原文地址:https://www.cnblogs.com/yixinliu/p/2348201.html