Вспышка SimpleButton застревает в состоянии? - PullRequest
4 голосов
/ 04 августа 2011

Я работаю над проектом Flash с использованием ActionScript 3.

Наш интерфейс переключается между различными режимами, добавляя и удаляя непосредственные дочерние элементы главной сцены - мы называем эти сцены.

Проблема, с которой я столкнулся, заключается в следующем: в одной из этих сцен есть кнопка SimpleButton (flash.display.SimpleButton) с различными состояниями «вверх» и «поверх». При наведении курсора на кнопку она переходит в состояние «над», как и ожидалось. Но если приложение автоматически переключается на новую сцену (в этом случае видео заканчивается, а приложение продолжается), а затем пользователь переходит назад (что приводит к повторному добавлению исходной сцены), кнопка остается в состоянии «до», пока Я возвращаюсь, а затем снова выхожу. Я бы хотел вернуть эту кнопку в рабочее состояние.

Я пытался установить b.overState = b.upState, но при последующих ролловерах внешний вид не изменился. Я также пытался отправить событие ROLL_OUT на объект кнопки, но это тоже ничего не делает.

Какие-нибудь идеи, кроме реализации чего-то с нуля, который предоставляет способ форсировать изменение состояния?

Ответы [ 7 ]

1 голос
/ 25 мая 2012

У меня была такая же проблема с некоторыми меню, каждое меню было удалено из списка отображения, прежде чем было добавлено новое.

После многих попыток найти работу вокруг лучшего, которое я нашел, было сохранить его.их в списке отображения и просто установите для их видимости значение false.

function setMenu(newMenu:Sprite = null):void
{
    menuA.visible = menuB.visible = menuC.visible = false;
    if(newMenu)
    {
        newMenu.visible = true;
    }
}
1 голос
/ 06 марта 2012

У меня та же проблема: на панели есть кнопки.Нажатие кнопки переключает окно.Когда панель восстановлена, она находится в неправильном состоянии.Я не могу исправить свою проблему с вашей проблемой, потому что на панели много разных кнопок.

Ошибка : 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);  
1 голос
/ 10 февраля 2012

вот что я должен был сделать:

// 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;
})

это не слишком красиво, но это работает.в моем случае я запускаю эту логику обмена, когда отображаю родительский элемент кнопок в списке отображения.если вы используете сцену, вы можете сделать это, как только сцена переключится обратно на сцену с вашей кнопкой.

0 голосов
/ 30 апреля 2014

Это легко исправить, если вы оставляете 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;
}
0 голосов
/ 11 ноября 2013

У меня была эта проблема, и после прочтения ответа 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;
}

Поэтому для каждой проблемной кнопки просто добавьте ResetButton(e.target as SimpleButton); в их прослушиватель событий CLICK.Не используйте его на каждой кнопке, потому что тогда, когда вы щелкнете по ней, сцена не изменится, кнопка не вернется в состояние «больше», а в состояние «вверх».Примените его к одной из обычных кнопок, если вы не знаете, что я имею в виду.

0 голосов
/ 08 августа 2011

Используйте взамен MOUSE_OVER и MOUSE_OUT.ROLL_OVER и ROLL_OUT не распространяются на дочерние объекты.

0 голосов
/ 08 августа 2011

Я бы попытался заменить simpleButton на MovieClip, но если вам нужно реальное решение, вам следует написать отчет об ошибке в Adobe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...