Flex的sprite有自帶的拖動方法,startDrag, stopDrag:app
1.startDrag方法:函數
startDrag(lockCenter:Boolean = false, bounds:Rectangle = null):voidspa
參數指針
lockCenter:Boolean(default = false) — 指定將可拖動的 sprite 鎖定到指針位置中心 (
true
),仍是鎖定到用戶第一次單擊該 sprite 的位置 (false
)。 code
bounds:Rectangle (default = null ) — 相對於 Sprite 父級的座標的值,用於指定 Sprite 約束矩形。blog
2.stopDrag 方法:事件
stopDrag():voidget
通常想實現一個sprite的拖動,mouseDown事件中執行 startDrag 方法, mouseUp事件中執行 stopDrag 方法it
例:io
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的方法並不穩定,除非走投無路,不建議使用。