我是ActionScript 2的长期用户,现在开始使用ActionScript3。我想念的一件事是复制AS2 MovieClip.onReleaseOutside功能的简单方法。几乎总是必须执行此事件,否则您会得到一些有趣的错误,例如Flash认为鼠标在真正抬起时就按下了。

根据AS2 to AS3 Migration Guide,我应该为此使用flash.display.InteractiveObject.setCapture(),但是据我所知它并不存在。我猜这个文件已经过时或不正确。我在网上找到了一些有关如何复制此功能的帖子,但它们都有自己的问题:

即使没有对应的onPress事件,

  • This one也会触发onReleaseOutside。
  • This one似乎效率很低,每次在应用程序内的任何位置单击鼠标时,都将添加和删除事件监听器。

  • 必须有一种更简单的方法,在重写Actionscript时不要告诉我Adobe忘记了这一点吗?

    示例AS2代码:
    // Assume myMC is a simple square or something on the stage
    
    myMC.onPress = function() {
      this._rotation = 45;
    }
    
    myMC.onRelease = myMC.onReleaseOutside = function() {
      this._rotation = 0;
    }
    

    如果没有onReleaseOutside处理程序,如果您按下方形按钮,将鼠标拖到其外部,然后松开鼠标,则该方形将不会旋转,并且会被卡住。

    最佳答案

    简单且万无一失:

    button.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler );
    button.addEventListener( MouseEvent.MOUSE_UP, buttonMouseUpHandler ); // *
    
    function mouseDownHandler( event : MouseEvent ) : void {
        trace( "onPress" );
        // this will catch the event anywhere
        event.target.stage.addEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
    }
    
    function buttonMouseUpHandler( event : MouseEvent ) : void {
        trace( "onRelease" );
        // don't bubble up, which would trigger the mouse up on the stage
        event.stopImmediatePropagation( );
    }
    
    function mouseUpHandler( event : MouseEvent ) : void {
        trace( "onReleaseOutside" );
        event.target.removeEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
    }
    

    如果您不关心 onRelease 和 onReleaseOutside 之间的区别(例如对于可拖动项目),您可以跳过按钮本身上的鼠标向上监听器(此处用星号注释)。

    关于flash - 在 AS3 中最简单的 onReleaseOutside 实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/255133/

    10-10 19:11