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

相关文章
相关标签/搜索