startDrag stopDrag
Flex的sprite有自带的拖动方法,startDrag, stopDrag:
1.startDrag方法:
startDrag(lockCenter:Boolean = false, bounds:Rectangle = null):void
参数
lockCenter:Boolean(default = false) — 指定将可拖动的 sprite 锁定到指针位置中心 (
true
),还是锁定到用户第一次单击该 sprite 的位置 (false
)。
bounds:Rectangle (default = null ) — 相对于 Sprite 父级的坐标的值,用于指定 Sprite 约束矩形。
2.stopDrag 方法:
stopDrag():void
一般想实现一个sprite的拖动,mouseDown事件中执行 startDrag 方法, mouseUp事件中执行 stopDrag 方法
例:
private exampleSprite:Sprite; // exampleSprite 初始化; // ... // 监听事件 // start drag exampleSprite.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); // stop drag exampleSprite.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); private var function mouseDownHandler(e:MouseEvent):void{ var target:Sprite = e.currentTarget; target.startDrag();
trace("start x:" + target.x + " y: " + target.y); } private var function mouseUpHandler(e:MouseEvent):void{ var target:Sprite = e.currentTarget; target.stopDrag();
trace("stop x:" + target.x + " y: " + target.y);
}
实际使用过程中,当targt.stopDrag()之后, target的位置显示是正确了,但是取target的x,y信息时,却没有更新,还是 start drag 之前的position。
解决这个bug有两种方法:
方案1: 可以记录下鼠标mouseDown和mouseUp的位置,计算出位置偏移量,在stop drag后自动更新
var startX:Number, startY:Number; private var function mouseDownHandler(e:MouseEvent):void{ var target:Sprite = e.currentTarget; target.startDrag(); trace("start x:" + target.x + " y: " + target.y); startX = e.stageX; // stageX, stageY 是相对于整个applicationde位置 startY = e.stageY; } private var function mouseUpHandler(e:MouseEvent):void{ var target:Sprite = e.currentTarget; target.stopDrag(); target.x += e.stageX - startX; target.y += e.stageY - startY; trace("stop x:" + target.x + " y: " + target.y); }
方案2:这个方法是从网上看来的,使用mx_internal,mx_internal是一个命名空间,用来存放将来有可能改变的函数和属性的命名空间
mx_internal具体指代什么,还没弄清楚,这里先记录下。待日后研究。
import mx.core.mx_internal; use namespace mx_internal; private var function mouseUpHandler(e:MouseEvent):void{ var target:Sprite = e.currentTarget; target.stopDrag(); target.x = target.mx_internal::$x; target.y = target.mx_internal::$y; trace("stop x:" + target.x + " y: " + target.y); }
这种方法要简单很多,但也有些人说mx_internal的方法并不稳定,除非走投无路,不建议使用。