Дождитесь окончания перехода между двумя изображениями - PullRequest
0 голосов
/ 18 марта 2011

Я разрабатываю приложение ActionScript 3.0 для Blackberry Playbook.

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

private function onEnterFrame(event:Event):void
{
    imageToFront.alpha += 0.1; // slow fade
    imageToBack.alpha -= 0.1;

    if( imageToFront.alpha >= 1.0 )
    {
        imageToFront.alpha = 1.0;

        // hide the first image
        imageToBack.alpha = 0.0;
        imageToBack.visible = false;

        // remove the enter frame event listener
        stage.removeEventListener( Event.ENTER_FRAME, onEnterFrame );
    }
}

Когда пользователь щелкает изображение, оно генерирует следующий обработчик щелчка:

private function onImageClicked(event:MouseEvent):void
{
    switch((event.currentTarget as Loader).name)
    {
        case imageCell11Back.name:
            imageToFront = imageCell11Front;
            imageToBack = imageCell11Back;
            break;
        case imageCell11Front.name:
            imageToFront = imageCell11Back;
            imageToBack = imageCell11Front;
            break;
        case imageCell12Back.name:
            imageToFront = imageCell12Front;
            imageToBack = imageCell12Back;
            break;
        case imageCell12Front.name:
            imageToFront = imageCell12Back;
            imageToBack = imageCell12Front;
            break;
        case imageCell13Back.name:
            imageToFront = imageCell13Front;
            imageToBack = imageCell13Back;
            break;
        case imageCell13Front.name:
            imageToFront = imageCell13Back;
            imageToBack = imageCell13Front;
            break;
        case imageCell21Back.name:
            imageToFront = imageCell21Front;
            imageToBack = imageCell21Back;
            break;
        case imageCell21Front.name:
            imageToFront = imageCell21Back;
            imageToBack = imageCell21Front;
            break;
        case imageCell22Back.name:
            imageToFront = imageCell22Front;
            imageToBack = imageCell22Back;
            break;
        case imageCell22Front.name:
            imageToFront = imageCell22Back;
            imageToBack = imageCell22Front;
            break;
        case imageCell23Back.name:
            imageToFront = imageCell23Front;
            imageToBack = imageCell23Back;
            break;
        case imageCell23Front.name:
            imageToFront = imageCell23Back;
            imageToBack = imageCell23Front;
            break;
    }
    stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    imageToFront.visible = true;
}

Iвозникают следующие проблемы:

Если пользователь нажимает на другое изображение до того, как предыдущее изображение не достигает альфа = 1,0, оно оставляет это изображение с альфа-значением менее 1,0.

Другими словами,Мне нужно что-то сделать слева onEnterFrame Функция установить альфа на 1,0.

Есть идеи?

Я пробовал с stage.hasEventListener(Event.ENTER_FRAME), но он не работает.

Ответы [ 2 ]

0 голосов
/ 19 марта 2011

Мое решение:

private function onEnterFrame(event:Event):void
{
    imageToFront.alpha += 0.1; // slow fade
    imageToBack.alpha -= 0.1;

    if( imageToFront.alpha >= 1.0 )
    {
        imageToFront.alpha = 1.0;

        // hide the first image
        imageToBack.alpha = 0.0;
        imageToBack.visible = false;

        // remove the enter frame event listener
        stage.removeEventListener( Event.ENTER_FRAME, onEnterFrame );
        faddingCard = false;
    }
}

Когда пользователь нажимает на изображение, оно выбрасывает следующий обработчик клика:

private function onImageClicked(event:MouseEvent):void
{
    if (faddingCard) return;

    switch((event.currentTarget as Loader).name)
    {
        case imageCell11Back.name:
            imageToFront = imageCell11Front;
            imageToBack = imageCell11Back;
            break;
        case imageCell11Front.name:
            imageToFront = imageCell11Back;
            imageToBack = imageCell11Front;
            break;
        case imageCell12Back.name:
            imageToFront = imageCell12Front;
            imageToBack = imageCell12Back;
            break;
        case imageCell12Front.name:
            imageToFront = imageCell12Back;
            imageToBack = imageCell12Front;
            break;
        case imageCell13Back.name:
            imageToFront = imageCell13Front;
            imageToBack = imageCell13Back;
            break;
        case imageCell13Front.name:
            imageToFront = imageCell13Back;
            imageToBack = imageCell13Front;
            break;
        case imageCell21Back.name:
            imageToFront = imageCell21Front;
            imageToBack = imageCell21Back;
            break;
        case imageCell21Front.name:
            imageToFront = imageCell21Back;
            imageToBack = imageCell21Front;
            break;
        case imageCell22Back.name:
            imageToFront = imageCell22Front;
            imageToBack = imageCell22Back;
            break;
        case imageCell22Front.name:
            imageToFront = imageCell22Back;
            imageToBack = imageCell22Front;
            break;
        case imageCell23Back.name:
            imageToFront = imageCell23Front;
            imageToBack = imageCell23Back;
            break;
        case imageCell23Front.name:
            imageToFront = imageCell23Back;
            imageToBack = imageCell23Front;
            break;
    }
    faddingCard = true;
    stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    imageToFront.visible = true;
}

Я добавил переменную класса faddingCard Boolean для управления при вызове onImageClick.

0 голосов
/ 18 марта 2011

Попробуйте установить прослушиватель событий на imageToFront, а также один на imageToBack следующим образом:


imageToFront.removeEventListener(Event.ENTER_FRAME, fadeIn);
imageToFront.addEventListener(Event.ENTER_FRAME, fadeIn);

imageToBack.removeEventListener(Event.ENTER_FRAME, fadeOut);
imageToBack.addEventListener(Event.ENTER_FRAME, fadeOut);

Функции замирания должны выглядеть следующим образом:


private function fadeIn(event : Event) : void {
    var currentLoader : Loader = event.target as Loader;
    currentLoader.alpha += .1;

    if(currentLoader.alpha >= 1) {
        currentLoader.removeEventListener(Event.ENTER_FRAME, fadeIn);
    }
}

private function fadeOut(event : Event) : void {
    var currentLoader : Loader = event.target as Loader;
    currentLoader.alpha -= .1;

    if(currentLoader.alpha (inf)= 0) {
        currentLoader.visible = false;
        currentLoader.removeEventListener(Event.ENTER_FRAME, fadeOut);
    }
}

** replace (inf) by <** Я не знаю, почему он усекается, если я его установил ... </p>

Для значений твининга вы должны смотреть на разные движки твининга, такие как TweenLite .

...