我正在使用ActionScript 3开发Flash项目。
我们的界面通过添加和删除主舞台的直接子节点在不同模式之间切换 - 我们称之为这些场景。
我遇到的问题是:其中一个场景有一个SimpleButton(flash.display.SimpleButton),具有明显的up和over状态。当我鼠标悬停按钮时,它会按预期进入过度状态。但是,如果应用程序自动切换到新场景(在这种情况下,视频结束并且应用程序继续运行)然后用户导航回来(导致原始场景重新添加),按钮将保持在过度状态,直到我再次进入鼠标然后再出来。我希望能够强制该按钮恢复到正常状态。
我尝试过设置b.overState = b.upState,但后来的翻转没有外观变化。我也尝试将ROLL_OUT事件分派给按钮对象,但这也没有做任何事情。
除了从头开始实施一些强制改变状态的方法之外的任何想法?
答案 0 :(得分: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;
})
它不太漂亮,但它有效。在我的情况下,当我将按钮父显示在显示列表中时,我会触发此交换逻辑。如果您正在使用场景,则可以在场景变回带有按钮的场景后进行。
答案 1 :(得分:1)
我有同样的问题: 面板有按钮。单击按钮可切换窗口。面板恢复后,按钮处于错误状态。 我无法解决您的问题,因为面板有许多不同的按钮。
错误:ROLL_OUT发生在我的面板从舞台上移除后(!)。这就是按钮无法正常恢复状态的真正原因。
错误修复(解决方法): 您应该生成ROLL_OUT事件BEFORE(!)将从舞台中删除父对象。执行此操作的简单方法是创建空精灵和重叠面板,例如:
第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);
答案 2 :(得分:1)
我在某些菜单上遇到了同样的问题,在添加新菜单之前,每个菜单都从显示列表中删除。
经过多次尝试找到最好的工作后,我发现将它们保留在显示列表中,并将其可见性设置为假。
function setMenu(newMenu:Sprite = null):void
{
menuA.visible = menuB.visible = menuC.visible = false;
if(newMenu)
{
newMenu.visible = true;
}
}
答案 3 :(得分:0)
我会尝试用simpleButton
替换MovieClip
,但如果您想要一个真正的解决方案,您应该向Adobe写一个错误报告。
答案 4 :(得分:0)
请改用 MOUSE_OVER
和 MOUSE_OUT
。
ROLL_OVER
和ROLL_OUT
不会传播到子对象。
答案 5 :(得分:0)
我遇到了这个问题,在阅读了gthmb的答案后,这就是我所做的。我在init期间将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);
即可。不要在每个按钮上使用它,因为当你点击它时,如果场景没有改变,按钮将不会回到过度状态而是回到向上状态。如果您不知道我的意思,请将其应用于其中一个普通按钮。
答案 6 :(得分:0)
如果你将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;
}