Flex 学习笔记------ stopDrag bug: 不更新x,y位置信息

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的方法并不稳定,除非走投无路,不建议使用。

posted on 2013-09-04 23:05  花森  阅读(415)  评论(0编辑  收藏  举报