Flex 學習筆記------ stopDrag bug: 不更新x,y位置信息

startDrag stopDrag

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的方法並不穩定,除非走投無路,不建議使用。

相關文章
相關標籤/搜索