Проблемы с репликацией перетаскивания мышью - PullRequest
0 голосов
/ 30 августа 2009

Я хочу повторить стандартные события startDrag / stopDrag с моей собственной подпрограммой, чтобы немного изменить ситуацию, и я столкнулся с некоторой проблемой распространения событий или пузырей. Вот мой код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
                mouseDown="mouseDown = true" mouseUp="mouseDown = false"
                mouseMove="mouseMove(event)">

  <mx:Script>
    <![CDATA[
        private var mouseDown:Boolean = false;
        private var oldMouseX:int = 0, oldMouseY:int = 0;

        private function mouseMove(e:MouseEvent):void {
            if (mouseDown) {
                object.x += (e.localX - oldMouseX);
                object.y += (e.localY - oldMouseY);
            }

            oldMouseX = e.localX;
            oldMouseY = e.localY;

            trace(e.localX);
        }
    ]]>
  </mx:Script>  

  <mx:Label id="object" text="Drag me" />

</mx:Application>

Проблема с этим кодом заключается в том, что при перетаскивании объекта вправо на трассе вы увидите, что иногда появляются случайные значения localX, в результате чего объект дергается из стороны в сторону.

Я не понимаю, как исправить эту часть, я действительно думаю, что это ярлык, который раздувает событие mousemove, но я не понимаю, как это остановить.
Любые предложения приветствуются!

1 Ответ

2 голосов
/ 30 августа 2009

Отслеживайте цель, о которой вы беспокоитесь, и слушайте только события непосредственно с нее. Итак, в вашей функции mousemove проверьте e.target == ваш объект. В этом случае приложение. Вы получите случайные события, всплывающие из подкомпонентов.

    public static function smoothDrag(pressEvent:MouseEvent, dragTarget:DisplayObject = null, done:Function=null, move:Function = null, parent:DisplayObject = null):void {
        var target:DisplayObject = dragTarget;
        parent = parent || target.parent;
        var eventParent:EventDispatcher = target.stage || parent;

        var moveFunc:Function = move;
        var doneFunc:Function = done;

        var startPoint:Point = MouseHelpers.pointTo(pressEvent.localX, pressEvent.localY, pressEvent.target as DisplayObject, parent);
        startPoint.x -= target.x
        startPoint.y -= target.y;

        var setPosition:Function = function(e:MouseEvent):void 
        {
            e.stopImmediatePropagation();
            var p:Point = MouseHelpers.pointTo(e.localX,e.localY, e.target as DisplayObject, parent);
            target.x = p.x - startPoint.x;
            target.y = p.y - startPoint.y;

            if (moveFunc != null) {
                moveFunc();
            }
        }

        var stopMove:Function = function(e:MouseEvent):void {
            e.stopImmediatePropagation();
            eventParent.removeEventListener(MouseEvent.MOUSE_MOVE, setPosition, true);
            eventParent.removeEventListener(MouseEvent.MOUSE_UP, stopMove, true);
            eventParent.removeEventListener(MouseEvent.ROLL_OVER, EventHelpers.stop, true);
            eventParent.removeEventListener(MouseEvent.MOUSE_OVER, EventHelpers.stop, true);

            if (doneFunc != null) {
                doneFunc(e);
            }
        }
        eventParent.addEventListener(MouseEvent.ROLL_OVER, EventHelpers.stop, true, 0, true);
        eventParent.addEventListener(MouseEvent.MOUSE_OVER, EventHelpers.stop, true, 0, true);
        eventParent.addEventListener(MouseEvent.MOUSE_MOVE, setPosition, true, 0, true);
        eventParent.addEventListener(MouseEvent.MOUSE_UP, stopMove, true, 0, true);
    }


    /**
     *  Translate a point from one object's reference into another. Best used when you have a descendant object x/y and you
     *  want to get that position relative to an ancestor. Uses the localToGlobal/globalToLocal style. 
     **/
    public static function pointTo(fromX:Number, fromY:Number, src:DisplayObject, dest:DisplayObject):Point {
        var p:Point = new Point(fromX, fromY);
        if(src != dest) {
            p = src.localToGlobal(p);
            p = dest.globalToLocal(p);
        }
        return p;
    }       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...