Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   слайдер с несколькими вариантами галерей (XML) (http://www.flasher.ru/forum/showthread.php?t=181401)

maritca 22.06.2012 13:31

слайдер с несколькими вариантами галерей (XML)
 
Вложений: 1
Есть XML-слайдер (см. вложенный исходник).
Необходимо сделать так, чтобы по нажатию кнопок подгружались разные xml файлы (то есть, в зависимости от нажатой кнопки, была видна каждый раз разная галерея).
Например, нажимаем кнопку Auto ID - подгружается файл datas.xml. Нажимаем кнопку "Торговое оборудование" - подгружается файл datas1.xml.

Как это лучше реализовать?

maritca 22.06.2012 13:57

Добавила пока следующее:

Код AS3:

btn1.addEventListener(MouseEvent.CLICK,btn1Clicked);
btn2.addEventListener(MouseEvent.CLICK,btn2Clicked);
// btn3.addEventListener(MouseEvent.CLICK,btn3Clicked);
// btn4.addEventListener(MouseEvent.CLICK,btn4Clicked);
// btn5.addEventListener(MouseEvent.CLICK,btn5Clicked);
// btn6.addEventListener(MouseEvent.CLICK,btn6Clicked);
 
function btn1Clicked(e:MouseEvent):void {       
      loadXML("datas.xml")
    }
function btn2Clicked(e:MouseEvent):void {       
      loadXML("datas1.xml")
    }

Вроде, частично получилось, но если я уже нажала кнопку btn1, но нажатия на кнопку btn2 ни к чему не приводят... И наоборот: если я загрузила XML по второй кнопке btn2, то уже никак нельзя переключиться на первый datas.xml

strangedk 22.06.2012 14:07

приведите код loadXML.

вероятно он единожды сохраняет загруженную XML и дальше не реагирует.

maritca 22.06.2012 14:28

Это?

Код AS3:

function loadXML(file:String):void{
        var xmlLoader:URLLoader = new URLLoader();
        xmlLoader.load(new URLRequest(file));
        xmlLoader.addEventListener(Event.COMPLETE, parseXML);
}

До меня пока не доходит, что конкретно нужно изменить...

strangedk 22.06.2012 14:36

Ну, здесь всё хорошо. А что делает ф-ция parseXML ?

maritca 22.06.2012 14:43

На всякий случай, копирую вместе с ф-цией loadImages:

Код AS3:

function parseXML(e:Event):void{
xml = new XML(e.target.data);
totalImages = xml.children().length();
loadImages();
}
 
function loadImages():void{
for(var i:int = 0; i<totalImages; i++){
 var loader:Loader = new Loader();
 loader.load(new URLRequest("images/"+String(xml.children()[i].@src)));
 images.push(loader);
 imagesLink.push(xml.children()[i].@link);//-------------------------------------------
 imagesText.push(xml.children()[i].@text);//-------------------------------------------
 loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress);
 loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
}
}


strangedk 22.06.2012 14:47

как вижу у вас заполняется массив images, и они далее добавляются в отображение.
А при повторной загрузке картинки всё еще остаются, и массив всё еще со старыми данными.

ваша задача - перед каждой загрузкой удалить картинки с визуального отображения, и очистить массив.
- скажите где располагается images? (где делается addChild для его элементов)

maritca 22.06.2012 14:57

Гм... давайте я приведу весь код целиком...

Код AS3:

import com.greensock.*;
import com.greensock.easing.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.navigateToURL;
 
var xml:XML;
var images:Array = new Array();
var imagesLink:Array = new Array();//------------------------------------
var imagesText:Array = new Array();//------------------------------------
var totalImages:Number;
var nbDisplayed:Number =3;
var imagesLoaded:int = 0;
var slideTo:Number = 0;
var imageWidth = 131;
 
var container_mc:MovieClip = new MovieClip();
slider_mc.addChild(container_mc);
container_mc.mask = slider_mc.mask_mc;
 
function loadXML(file:String):void{
        var xmlLoader:URLLoader = new URLLoader();
        xmlLoader.load(new URLRequest(file));
        xmlLoader.addEventListener(Event.COMPLETE, parseXML);
}
 
function parseXML(e:Event):void{
xml = new XML(e.target.data);
totalImages = xml.children().length();
loadImages();
}
 
function loadImages():void{
for(var i:int = 0; i<totalImages; i++){
 var loader:Loader = new Loader();
 loader.load(new URLRequest("images/"+String(xml.children()[i].@src)));
 images.push(loader);
 imagesLink.push(xml.children()[i].@link);//-------------------------------------------
 imagesText.push(xml.children()[i].@text);//-------------------------------------------
 loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress);
 loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
}
}
 
function onProgress(e:ProgressEvent):void{
loading_txt.text = "Loading " + imagesLoaded + " / " + totalImages;
}
 
function onComplete(e:Event):void{
imagesLoaded++;
if(imagesLoaded == totalImages){
 loading_txt.text = "";
 createImages();
}
}
 
function createImages():void{
for(var i:int = 0; i < images.length; i++){
 var bm:Bitmap = new Bitmap();
 var holder:MovieClip=new MovieClip(); //------------------------------------
 bm = Bitmap(images[i].content);
 bm.smoothing = true;
 holder.y= i*imageWidth;//------------
 holder.addChild(bm);//--------------
 //bm.y = i*imageWidth;
 //var currTxt:imText=new imText();
 //currTxt.txt.text=imagesText[i];
 //currTxt.y=50;
 //holder.addChild(currTxt);
 holder.addEventListener(MouseEvent.CLICK,goSite);
 holder.id=i;
 container_mc.addChild(holder); //--------------------------
}
}
 
function goSite(e:MouseEvent) {
var mc:MovieClip=MovieClip(e.target);
navigateToURL(new URLRequest(imagesLink[mc.id]));
}
 
previous_btn.addEventListener(MouseEvent.CLICK,slideLeft);
next_btn.addEventListener(MouseEvent.CLICK,slideRight);
 
function slideLeft(e:MouseEvent):void{
slideTo -= nbDisplayed;
slideContainer();
}
 
function slideRight(e:MouseEvent):void{
slideTo += nbDisplayed;
slideContainer();
}
 
function slideContainer():void{
if(totalImages - slideTo < nbDisplayed)
 slideTo = totalImages - nbDisplayed;
if(slideTo < 0)
 slideTo = 0;
 
TweenLite.to(container_mc,.5,{y:-slideTo*imageWidth,ease:Quad.easeIn});
}
 
//-------------------------------------------------------------------------
//private function setUpListeners():void {
                btn1.addEventListener(MouseEvent.CLICK,btn1Clicked);
                btn2.addEventListener(MouseEvent.CLICK,btn2Clicked);
                // btn3.addEventListener(MouseEvent.CLICK,btn3Clicked);
                //btn4.addEventListener(MouseEvent.CLICK,btn4Clicked);
                //btn5.addEventListener(MouseEvent.CLICK,btn5Clicked);
                // btn6.addEventListener(MouseEvent.CLICK,btn6Clicked);
//}
 
function btn1Clicked(e:MouseEvent):void {       
              loadXML("datas.xml");               
      }
function btn2Clicked(e:MouseEvent):void {       
              loadXML("datas1.xml");               
      }

Может, можно каким-либо образом просто добавить функцию отмены предыдущего клика/загрузки xml в конце, где function btnClicked?

strangedk 22.06.2012 15:15

в ф-ции createImages в самом начале пропишите:

Код AS3:

while (container_mc.numChildren) {
    container_mc.removeChildAt(0);
}

а в ф-ции loadImages в самом начале строку:
Код AS3:

images = null;


maritca 22.06.2012 15:48

Сделала, получила
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at FlowerMenu/loadImages()
at FlowerMenu/parseXML()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()


Часовой пояс GMT +4, время: 01:20.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.