限制 Flex PopUp 的拖动区域

使用Flex的PopUpManager, 也许很多人都遇到过,弹出一个可以拖动的TitleWindow,结果不小心给拖动到了Flex应用的外部,结果TitleWindow的标题栏被浏览器的工具栏给挡住了,无法拖动回来。这个是让人很崩溃的问题。

我一直认为这是Flex的一个bug。可惜官方没有重视这个问题。其实解决办法也有不少,其他的我在这里就不说了,我还是喜欢最简单最有效的办法来解决问题。

思路:通过阅读 Panel 里面Drag相关的代码你会发现,最后StopDrag会调用 move 方法。所以就可以监听move事件,限制拖动区域。

1.在弹出的时候加入move的监听

2.在move的监听里判断组件的 y 值。如果超出有效值(保证在组件在Flex应用内),设置成临界值。

代码:

var pop:SomeComp = new SomeComp();
pop.addEventListener(MoveEvent.MOVE, moveMe);
PopUpManager.addPopUp(pop, FlexGlobals.topLevelApplication as DisplayObject, true);
PopUpManager.centerPopUp(pop);
private function moveMe(e:Event):void {
	var target:UIComponent=e.target as UIComponent;
	var targetX:Number=target.x;
	var targetY:Number=target.y;
	var appWidth:Number=FlexGlobals.topLevelApplication.width;
	var appHeight:Number=FlexGlobals.topLevelApplication.height;
	
	if (targetY < 10) {
		target.y=10;
	}
	if (targetY > appHeight - 30) {
		target.y=appHeight - 30;
	}
}