zoukankan      html  css  js  c++  java
  • 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的方法并不稳定,除非走投无路,不建议使用。

    -----------------------------一花开五叶 结果自然成-------------------------------------------------
  • 相关阅读:
    javaweb登录验证码的实现
    jQuery Ajax 简单的实现跨域请求
    Java Socket长连接示例代码
    Java socket长连接代码实现
    带日期的bean转为json(bean->JSON)
    函数迭代器、生成器、递归
    闭包函数和装饰器
    函数名称空间与作用域
    函数基础
    基本的文件操作
  • 原文地址:https://www.cnblogs.com/zyc-undefined/p/3296845.html
Copyright © 2011-2022 走看看