一个长方型AIR窗体,一个水平图片展示列表。图片支持拖拽,需要检测图片是否拖拽出了窗体并释放鼠标,一旦检测到就要删除该图片。
于是啃了啃AIR的NativeDrag相关的资料。发现NativeDragEvent的几个event都无法对应这个event。
也许你会觉得可以侦听整个app,譬如stage的nativeDragExit,也就是当拖拽图片离开app边界的事件,但是问题来了,如果用户拖出去了发觉又不想删了又拖回来了呢?问题的关键是要侦听到鼠标释放的时候,鼠标是否还在窗体外。
于是想到了mouseup事件,我曾怀疑当鼠标按下并托拽出air窗体,在窗体外释放是否会触发mouseup,经过测验,是可以触发的。也就是此时你可以侦听到stage的mouse_up事件。
侦听到了mouse_up事件,又该怎么判断是否在窗体外释放鼠标的呢?发生该事件时,stage的mouseX和mouseY是怎样的呢?
于是做了个小测验,结果大大出乎意料,mouse_up事件发生时,pt(stage.mouseX, stage.mouseY)在linux和windows上表现不一致。
请参看下图,
假定鼠标移出窗体对应的交汇点为pt1,pt(stage.mouseX, stage.mouseY)跟pt1的关系为:
linux:pt = pt1在整个screen坐标系的坐标
windows:pt = pt1在AIR窗体坐标系的坐标
因此判断是否在窗体外释放鼠标代码如下:
//function onStageMouseUp
//判断AIR窗体在screen中的区域
var rect:Rectangle = new Rectangle(app.nativeWindow.x, app.nativeWindow.y, app.nativeWindow.width, app.nativeWindow.height);
//pt
var pt:Point = new Point(app.nativeWindow.stage.mouseX, app.nativeWindow.stage.mouseY);
//判断是否windows,如果是,则将pt转换为screen坐标
if(Capabilities.os.indexOf("Windows") != -1)
pt = app.nativeWindow.globalToScreen(pt);
//判断pt是否在AIR窗体区域内
var outside:Boolean = (pt.x <= rect.x || pt.y <= rect.y || pt.x >= rect.x+rect.width || pt.y >= rect.y+rect.height);
trace(outside);
if(outside && isnativedragging)
//删除
else
// do nothing