AIR NativeDrag判断是否拖拽出窗体并外部释放鼠标
sshong 发表于2010年3月4日 15:30:00 更新于2010年3月4日 15:49:00
最近做一个AIR项目时,遇到这么个需求。
一个长方型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
标签:NativeDragAIR拖拽分类:RIA阅读:3816
评论
暂无评论
添加评论
您的大名,限长10汉字,20英文(*)
电子信箱(*)
您的网站
正文,限长500汉字,1000英文(*)
验证码(*) 单击刷新验证码
联系我
博客订阅