【问题标题】:Flash SimpleButton sticks in over state?Flash SimpleButton 停留在过度状态?
【发布时间】:2011-08-04 15:50:09
【问题描述】:

我正在使用 ActionScript 3 开发一个 Flash 项目。

我们的界面通过添加和删除主舞台的直接子级在不同模式之间切换——我们称之为场景。

我遇到的问题是:其中一个场景有一个 SimpleButton (flash.display.SimpleButton) 具有不同的 up 和 over 状态。当我将鼠标悬停在按钮上时,它会按预期进入过度状态。但是如果应用程序自动切换到新场景(在这种情况下,视频结束并且应用程序继续运行)然后用户导航回来(导致重新添加原始场景),按钮将保持在结束状态,直到我将鼠标移回然后再次移出。我希望能够强制该按钮回到其向上状态。

我尝试设置 b.overState = b.upState,但随后的翻转没有外观变化。我也尝试将 ROLL_OUT 事件分派给按钮对象,但这也无济于事。

除了从头开始实现某些东西之外,还有什么想法可以揭示一种强制改变状态的方法吗?

【问题讨论】:

  • 总猜测,所以不值得回答,但您是否尝试过将其已启用属性切换为 false,然后返回 true?
  • @shanethehat:我今天早上早些时候确实尝试过。没运气。谢谢。 :)
  • 只是好奇,您是否将hitTestState 属性设置为与您的overState 相同的DisplayObject
  • @Peter:确实如此。卡住状态问题似乎很简单,因为当鼠标仍在按钮上方时,按钮已从显示列表中删除,因此它从未注册过滚动。
  • 您是否尝试在按钮添加回显示列表后调度 ROLL_OUT?

标签: flash actionscript-3


【解决方案1】:

这是我必须做的:

// store ref to normal over state
var overState = myBtn.overState;

// since we cant change the state, change the over state's asset to the up state
myBtn.overState = myBtn.upState;

// since we want the state to change on mouse over, reset the overstate once it rolled over again
myBtn.addEventListener(MouseEvent.MOUSE_OVER, function(e){
    myBtn.overState = overState;
})

它不是太漂亮,但它有效。就我而言,当我将按钮父级渲染到显示列表时,我会触发此交换逻辑。如果您使用的是场景,您可能可以在场景变回带有按钮的场景后执行此操作。

【讨论】:

    【解决方案2】:

    我有同样的问题: 面板有按钮。单击按钮切换窗口。当面板恢复时,它的按钮处于错误状态。 我无法解决您的问题,因为面板有许多不同的按钮。

    错误:ROLL_OUT 发生在我的面板从舞台上移除之后(!)。这才是按钮无法正常恢复状态的真正原因。

    错误修复(解决方法): 您应该在父对象从舞台上移除之前生成 ROLL_OUT 事件。最简单的方法是创建一个空的精灵和重叠面板,例如:

    第 1 步:

      var overlay:Sprite = new Sprite();
      overlay.graphics.beginFill( 0x000000, .5 );
      overlay.graphics.drawRect( 0, 0,  _sprite.width, _sprite.height );
      overlay.graphics.endFill();
      overlay.x = _sprite.x;
      overlay.y = _sprite.y;
      overlay.name = "TRICK";
      addChild(overlay); // The top element overlay is override the buttons and it’s automatically generated event ROLL_OUT
    

    第 2 步: 如果带有面板和按钮的窗口恢复,则删除覆盖:

      var overlay:Sprite = this.getChildByName("TRICK") as Sprite;
      if (overlay) removeChild(overlay);  
    

    【讨论】:

      【解决方案3】:

      我在某些菜单上遇到了同样的问题,在添加新菜单之前,每个菜单都已从显示列表中删除。

      在多次尝试找到解决我发现的最佳解决方案后,将其保留在显示列表中,并将其可见性设置为 false。

      function setMenu(newMenu:Sprite = null):void
      {
          menuA.visible = menuB.visible = menuC.visible = false;
          if(newMenu)
          {
              newMenu.visible = true;
          }
      }
      

      【讨论】:

        【解决方案4】:

        请改用 MOUSE_OVERMOUSE_OUTROLL_OVERROLL_OUT 不会传播到子对象。

        【讨论】:

          【解决方案5】:

          我会尝试将simpleButton 替换为MovieClip,但如果您想要真正的解决方案,您应该向Adobe 写一份错误报告。

          【讨论】:

            【解决方案6】:

            我遇到了这个问题,在阅读了 gthmb 的回答后,这就是我所做的。我在初始化期间将 hitTestState 设置为与 overState 相同(之前与 upState 相同),并且:

            public static function ResetButton(b:SimpleButton):void
            {
               b.overState = b.upState;
               b.addEventListener(MouseEvent.MOUSE_OVER, RestoreButton);
            }
            
            private static function RestoreButton(e:Event):void
            {
               e.target.removeEventListener(MouseEvent.MOUSE_OVER, RestoreButton);
               e.target.overState = e.target.hitTestState;
            }
            

            因此,对于每个有问题的按钮,只需在其 CLICK 事件侦听器中添加 ResetButton(e.target as SimpleButton);。但是不要在每个按钮上都使用它,因为当你点击它时,如果场景没有改变,按钮不会回到 over 状态而是 up 状态。如果您不明白我的意思,请将其应用于其中一个普通按钮。

            【讨论】:

              【解决方案7】:

              如果您将 SimpleButton 留在舞台上,但您设置了 visible = false,这很容易解决。但是,如果您想将其从舞台上移除并确保按钮上已调度事件 mouse_out,我建议您这样做:

              要将 SimpleButton 设置回鼠标移出状态,我建议几秒钟后假设用户房屋被鼠标移出,您可以将其从舞台上移除,请参见以下示例:

              _removeTimer = new Timer(2000);
              _removeTimer.addEventListener(TimerEvent.TIMER, _onRemove);
              
              function _onClick(e:MouseEvent):void{
                          e.stopPropagation();
                          //hide button for now
                          _button.visible = false;
                          //move button to trigger mouse event
                          _button.x = 0;
                          _button.y = 0;
                          e.updateAfterEvent();
                          e.stopPropagation();
                          //set timer to remove the button later
                          _removeTimer.start();
              
              }
              
              function _onRemove(e:Event):void{
                          _removeTimer.stop();
                          _button.parent.removeChild(_button);
                          //reset button to original coordinates
                          _button.x = 100;
                          _button.y = 300;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-01-24
                • 2011-12-02
                • 2019-12-19
                • 2021-08-12
                • 1970-01-01
                • 2022-08-03
                • 2014-09-16
                相关资源
                最近更新 更多