检测鼠标在锁定的可拖动对象上的移动和释放

时间:2010-08-10 14:44:24

标签: flash actionscript-3 mouse draggable

我正在制作一个自定义滑块组件。头部(你拖动的东西)编程如下:

        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 个答案:

答案 0 :(得分:1)

不要在head的MOUSE_MOVE事件中调用updateLevel(),而是在head的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添加到head

答案 1 :(得分:0)

在AS3中,这是通过向侦听MOUSE_UP事件的舞台添加MouseEvent侦听器来处理的。

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事件作出反应......你是否希望它在你从手柄上滚开后仍然有反应?根据您希望如何工作,可以通过多种方式完成。

请详细说明您正在寻找的行为。