代码之家  ›  专栏  ›  技术社区  ›  davr

在AS3中最容易实现OnReleaseOutside?

  •  4
  • davr  · 技术社区  · 16 年前

    我是一个长期的ActionScript2用户,现在开始使用ActionScript3。我缺少的一件事是一种简单的方法,可以复制AS2的movieclip.onreleaseOutside的功能。几乎总是有必要实现这个事件,否则你会得到一些有趣的错误,比如flash认为你的鼠标在真正启动的时候是向下的。

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

    • This one 即使没有相应的onPress事件,也会在外部触发onReleaseOutside。
    • This one 看起来效率很低,每次在应用程序中的任何地方单击鼠标时,都会添加和删除事件侦听器。

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

    示例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处理程序,如果按下squre,将鼠标拖到squre之外,然后释放鼠标,则正方形将不会旋转,并且似乎卡住了。

    3 回复  |  直到 13 年前
        1
  •  10
  •   Antti    16 年前

    简单而简单:

    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(例如,对于可拖动的项目)之间的区别,您可以跳过按钮本身的鼠标向上侦听器(此处用星号注释)。

        2
  •  3
  •   Rafe    16 年前

    root.addEventListener(mouseEvent.up,onMouseReleaseOutside);

    当然了,你定义了鼠标器。基本上,在你的按钮(或mc)之外发生的任何mouseEvent.up(鼠标释放)都会击中舞台而不是你的按钮。这是我通常的方法。

        3
  •  3
  •   Ronnie Liew    16 年前

    你看过这个活动吗?

    flash.events.Event.MOUSE_LEAVE
    



    从文档中:

    当鼠标指针移出阶段区域时由阶段对象调度。 event.mouse保留常量定义mouse leave事件对象的type属性值。

    如果你只感兴趣的话,它会解决你的问题:如果用户的鼠标不在舞台上,而不是仅仅在特定的movieclip之外。