Не могу получить рабочий индикатор выполнения для загрузки файла AS3 - PullRequest
2 голосов
/ 08 декабря 2011

В настоящее время я зачислен на курс ActionScript и не могу заставить мой индикатор выполнения работать правильно.Перед нами была поставлена ​​задача создать простое приложение для загрузки изображений, которое получало бы доступ к изображениям, размещенным извне (посредством использования прокси-скрипта PHP), а затем выплевывало изображение на экран пользователя (с событием хода выполнения и индикатором выполнения для отслеживания хода загрузки изображения).).

Однако, когда я запускаю его, я получаю эти таинственные черные графические сбои повсюду, а также неработающий индикатор выполнения.В некоторых браузерах я получаю следующую ошибку: «ArgumentError: Ошибка № 2109: NaN метки кадра не найден в сцене NaN. At flash.display.MovieClip / gotoAndStop () в Document / imageLoadProgress ().

Вотмой код - я не могу на всю жизнь выяснить, что не так. Я полагаю, что это как-то связано с функцией imageLoadProgress (), или с моим индикатором выполнения (который представляет собой простой 100-кадровый видеоклип с анимацией движения икоманда "stop ()" в начале).

public function loadImage()
    {
        var imageURL:String = imageArray[currentImageIndex];
        if(loaderInfo.url.substr(0,4) == "http")
        {
            trace("we're online");
            //use the proxy script
            //escape() will replace spaces in file names with %20
            imageURL = "./image_proxy.php?filename=" + escape(imageArray[currentImageIndex]);
        }

        var imageRequest:URLRequest = new URLRequest(imageURL);
        this.imageLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.imageIOError);
        this.imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, this.imageLoadProgress);
        this.imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.imageLoadComplete);
        this.imageLoader.load(imageRequest);
        //end loadImage
    }

    public function imageIOError(e:Event)
    {
        trace("ImageIOError called. Error=" + e);
        //end imageIOError
    }

    public function imageLoadProgress(e:ProgressEvent)
    {
        var percentLoaded:Number = e.bytesLoaded/e.bytesTotal;
        percentLoaded = Math.round(percentLoaded * 100);
        //this.progress_mc.scaleY = percentLoaded;
        if (percentLoaded < 1)
        {
            this.progressBar.gotoAndStop(1);
        }
        else
        {
            this.progressBar.gotoAndStop(percentLoaded);
        }
        //end imageLoadProgress
    }

1 Ответ

2 голосов
/ 08 декабря 2011

Ваш скрипт загрузчика кажется мне абсолютно нормальным, за исключением небольшого недостатка: единственный способ, которым NaN (== не число) в вашем сообщении об ошибке имеет смысл для меня, если ваше свойство ProgressEvent bytesTotal равно 0- потому что деление на ноль не дает действительных результатов, как мы все знаем.

Я не могу точно сказать, почему это происходит, не зная вашего серверного кода, но я предполагаю, что это произойдет, если ваш прокси-скрипт PHP неправильно установит заголовок ответа Content-Length HTTP.Если бы вы загружали реальный файл изображения, веб-сервер автоматически установил бы заголовок для вас - в случае вашего прокси-скрипта, кажется, вы должны позаботиться об этом сами.

В любом случае, вы можете сделатьваш скрипт загрузчика более защищен от ошибок, протестировав NaN и убедившись, что кадр, к которому вы переходите, никогда не превышает 100:

var frame:int = isNaN (percentLoaded) || percentLoaded < 1 ? 1 : 
                         percentLoaded > 100 ? 100 : percentLoaded;
progressBar.gotoAndStop(frame);

(я выбрал сокращенное обозначение, но по сути это то же самое, чтонаписание двух if заявлений и else).

...