Обнаружение движения и отпускания мыши на заблокированном перетаскиваемом объекте - PullRequest
0 голосов
/ 10 августа 2010

Я делаю пользовательский компонент слайдера. Голова (та вещь, которую вы перетаскиваете) запрограммирована так:

        head.addEventListener(MouseEvent.MOUSE_DOWN, function():void {
            head.startDrag(false, new Rectangle(stubDiv,0,width - stubDiv - ((levels-maxLevel)*stubDiv),0));
        });
        head.addEventListener(MouseEvent.MOUSE_MOVE, function():void {
            updateLevel();
        });
        head.addEventListener(MouseEvent.MOUSE_UP, function():void {
            head.stopDrag();
            setHeadPos();
        });

Поскольку голова ограничена областью ползунка, мышь может отойти от нее. Если это происходит, объект все еще перетаскивается, но он не получает ни событий MOUSE_MOVE, ни события MOUSE_UP, если мышь отпущена.

Какое лучшее решение?

Ответы [ 2 ]

1 голос
/ 10 августа 2010

Вместо вызова updateLevel () в событии MOUSE_MOVE головы, вызовите его в событии ENTER_FRAME главы:

head.addEventListener(MouseEvent.MOUSE_DOWN, function():void { 
    head.startDrag(false, new Rectangle(stubDiv,0,width - stubDiv - ((levels-maxLevel)*stubDiv),0)); 
    head.addEventListener(Event.ENTER_FRAME, function():void  { updateLevel(); });
}); 

head.addEventListener(MouseEvent.MOUSE_UP, function():void { 
    head.stopDrag(); 
    head.removeEventListener(Event.ENTER_FRAME, function():void  { updateLevel(); });
    setHeadPos(); 
}); 

head.Stage.addEventListener(Event.MOUSE_LEAVE, function():void { 
    head.stopDrag(); 
    head.removeEventListener(Event.ENTER_FRAME, function():void  { updateLevel(); });
    setHeadPos(); 
}); 

Я уже работал над аналогичной функцией, и мне также нужно было обработать Stage Mouse_Leave.В зависимости от ваших требований, вы также можете добавить MouseEvent.MOUSE_OUT в заголовок

0 голосов
/ 10 августа 2010

В AS3 это выполняется путем добавления прослушивателя MouseEvent к сцене, прослушивающей событие MOUSE_UP.

head.addEventListener(MouseEvent.MOUSE_DOWN, _handleDown);

function _handleDown($evt:MouseEvent):void {
    // add a MouseEvent.MOUSE_UP listener to the stage
    stage.addEventListener(MouseEvent.MOUSE_UP, _handleUp);
    head.removeEventListener(MouseEvent.MOUSE_DOWN, _handleDown);
    head.addEventListener(MouseEvent.MOUSE_MOVE, _handleMove);
    head.addEventListener(MouseEvent.MOUSE_UP, _handleUp);
    head.startDrag(false, new Rectangle(stubDiv,0,width - stubDiv - ((levels-maxLevel)*stubDiv),0)
}

function _handleMove($evt:MouseEvent):void {
    updateLevel();
}

function _handleUp($evt:MouseEvent):void {
    // remove the MouseEvent.MOUSE_UP listener from the stage
    stage.removeEventListener(MouseEvent.MOUSE_UP, _handleUp);
    head.removeEventListener(MouseEvent.MOUSE_UP, _handleUp);
    head.removeEventListener(MouseEvent.MOUSE_MOVE, _handleMove);
    head.addEventListener(MouseEvent.MOUSE_DOWN, _handleDown);
    head.stopDrag();
    setHeadPos();
}

Как видите, из соображений стиля я избегаю использования анонимных функций в моих слушателях событий. Это обеспечивает большую гибкость в большинстве случаев, и, на мой взгляд, намного проще для чтения.

Что касается другой вашей проблемы, то, что "ручка прокрутки" не реагирует на события MOUSE_MOVE ... хотите ли вы, чтобы она все еще реагировала даже после того, как вы откатились от ручки? В зависимости от того, как вы хотите, чтобы это работало, это можно сделать разными способами.

Пожалуйста, уточните, какое именно поведение вы ищете.

...