flex可拖动的panel

package createDrag{
	import mx.containers.Panel;
	import flash.events.MouseEvent;
	import flash.geom.Point;

	/**
	 * 可拖动panel组件
	 */
	public class DragPanel extends Panel{
		private var _startX: Number;
		private var _startY: Number;
		private var _dragStartX: Number;
		private var _dragStartY: Number;
		private var _isDragging: Boolean = false;
		
		/**
		 *createChildren(子组件创建完成)方法执行完后,派发initialize(初始化事件)
		 */		
		override public function initialize(): void {
			super.initialize();
			addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
		}
		
		/**
		 *鼠标按下事件处理函数 
		 * @param event
		 */		
		private function handleMouseDown(event: MouseEvent): void {
			var contentPoint: Point = globalToContent(new Point(event.stageX, event.stageY));
			//此时以内容区域的点为参考,可拖动区域的y坐标始终为负数
			if (contentPoint.y < 0) {
				//在鼠标事件,我们需要捕获所有移动/事件,甚至如果我们没有目标(因为鼠标通常会离开我们的当前的边界)。
				//为此,我们与顶级注册这些听众SystemManager,并设置useCapture第一个真正获得打开事件。
				//这基本上相当于老setCapture()方法。
				systemManager.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, true);//在捕获阶段获取事件
				systemManager.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp, true);

				_startX = x;
				_startY = y;
				_dragStartX = event.stageX;
				trace(x+"----------"+event.stageX)
				_dragStartY = event.stageY;
				
				// Clear any constraints that might have been set, so we can move around freely.
				clearStyle("left");
				clearStyle("right");
				clearStyle("top");
				clearStyle("bottom");
				clearStyle("horizontalCenter");
				clearStyle("verticalCenter");
				_isDragging = true;
			}
		}
		
		/**
		 *鼠标移动事件处理函数 
		 * @param event
		 */		
		private function handleMouseMove(event: MouseEvent): void {
			if (_isDragging) {
				// 不允许的实际目标事件来处理它。
				event.stopImmediatePropagation();
				move(_startX + event.stageX - _dragStartX, _startY + event.stageY - _dragStartY);
			}
		}

		/**
		 *鼠标抬起事件处理函数 
		 * @param event
		 */		
		private function handleMouseUp(event: MouseEvent): void {
			if (_isDragging) {
				// 不允许的实际目标事件来处理它。
				event.stopImmediatePropagation();
				move(_startX + event.stageX - _dragStartX, _startY + event.stageY - _dragStartY);
				systemManager.removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, true);
				systemManager.removeEventListener(MouseEvent.MOUSE_UP, handleMouseUp, true);
				_isDragging = false;
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值