Actionscript 3 Как загрузить PNG в рабочую область на основе значения веб-службы? - PullRequest
0 голосов
/ 10 мая 2011

Доброе утро,

Я запрашиваю веб-сервис XML Weather.com для получения текущего значения температуры, ощущения как значок температуры и текущего состояния. У меня есть первые два значения, которые будут разделять текстовые поля на сцене, и это прекрасно работает. Однако сейчас я пытаюсь реализовать оператор switch таким образом, чтобы текущее значение значка условия в XML читалось моим сценарием, а соответствующий PNG становится исходным значением UILoader.

Прежде всего, является ли UILoader лучшим компонентом для отображения PNG на сцене?

Вот мой код:

var src: UILoader.source=uicondicon.source;
switch(src){
case "0 PNG":                   
src=trace(resultXML.cc.icon)=0;
break;
case "11 PNG":
src=trace(resultXML.cc.icon)=11;
break;
default src=trace(resultXML.cc.icon)=0:
}

Когда я компилирую вышеприведенный код, я получаю ошибку 1084, ожидающую двоеточие перед src в последней строке кода (мое задание по умолчанию).

Учитывая, что, возможно, потребуется отобразить 47 различных значков, это лучший способ реализовать эту функцию?

Наконец, как сделать так, чтобы компонент UILoader отображался только во время определенного набора кадров в приложении?

Большое спасибо !!

1 Ответ

2 голосов
/ 10 мая 2011

1) Ошибка, которую вы получаете, вероятно, потому, что последняя строка в вашем операторе switch заканчивается точкой с запятой вместо точки с запятой - "default src = trace (resultXML.cc.icon) = 0:"

2) Я никогда не использовал UILoader - обычно я просто использую Loader:

var loader:Loader = new Loader;
var images:Array = [];
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);

loader.load(new URLRequest("image url here.jpg"));

protected function completeHandler(e:Event):void {
 // you can pull out the loader content and cast it as a bitmap...
 images.push(loader.content as Bitmap);

 // or you can simply add the loader to the stage
 addChild(loader);
 clearListeners();

}

protected function errorHandler(e:IOErrorEvent):void {
 trace("Error loading image! Here's the error:\n" + e);
 clearListeners();
}

protected function progressHandler(e:ProgressEvent):void {
 trace("Load is " + (100 * e.bytesLoaded / e.byteTotal) + " percent complete...");
}

protected function clearListeners():void {
 loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);
 loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
 loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
}

3) Если вы загружаете несколько изображений одновременно, вы должны знать, что порядок, в котором вызываются ваши грузы, НИЧЕГО не имеет с порядком, в котором они завершены. Таким образом, вы не можете предполагать, что, поскольку вы загружаете изображение A, а затем изображение B, изображение A будет первым. Таким образом, вы должны сделать некоторую логику, чтобы отслеживать ваши загрузчики - например, вы можете иметь такую ​​настройку:

var urls:Array = [this array has all of your urls in it];
var loaders:Array = [];
var images:Array = [];

protected function initLoaders():void {
 for (var i:int = 0; i < urls.length; i++) {
  var loader:Loader = new Loader();
  loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
  // you'll want to add your other handlers here too for IOErrorEvent and Progress.
  loader.load(new URLRequest(urls[i]));
  loaders[i] = loader;
 }
}

protected function completeHandler(e:Event):void {
 var loaderIndex:int = loaders.indexOf(e.currentTarget); // this tells you which loader finished
 images[loaderIndex] = e.currentTarget.content as Bitmap; // I think this will work, you may have to play with Array syntax to make sure you're not adding tons of empty items and screwing up your order.

 if (images.length == urls.length) {
  trace("All images loaded!");
 }
}

4) Наконец, не используйте фреймы. Вы хотите написать свой код во внешнем классе. Если он должен быть привязан к данному кадру, используйте visible = true или visible = false в зависимости от текущего кадра. Но все это можно и нужно обрабатывать в коде, поскольку это действительно бизнес-логика, и она не должна быть тесно связана с вашим представлением (то есть визуальным отображением, которое можно привязать к кадрам).

Надеюсь, это поможет!

...