Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Kaczala

Problema Scrollbar + XML

Recommended Posts

Buenas galera!

 

Seguinte, tô com um problema e não consigo achar uma solução lógica pra ele, não sei se alguém poderia me ajudar. Tenho que mostrar uma lista vinda de um XML na tela, e estou usando uma classe de scrollbar pronta pra isso. O conteúdo é carregado corretamente, porém a rolagem não funciona e aponta o seguinte erro:

 

 

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Scrollbar/startScroll()
at Scrollbar/moveScroll()

 

Código da Scrollbar:

 

 

	 /**
 * Flashscaper Scrollbar Component
 * Customizable Scrollbar
 * @author		Li Jiansheng
 * @version		1.0.0
 * @private
 * @website     http://www.flashscaper
 */

package {

import caurina.transitions.*;
import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class Scrollbar extends MovieClip {

	private var target:MovieClip;
	private var top:Number;
	private var bottom:Number;
	private var dragBot:Number;
	private var range:Number;
	private var ratio:Number;
	private var sPos:Number;
	private var sRect:Rectangle;
	private var ctrl:Number;//This is to adapt to the target's position
	private var trans:String;
	private var timing:Number;
	private var isUp:Boolean;
	private var isDown:Boolean;
	private var isArrow:Boolean;
	private var arrowMove:Number;
	private var upArrowHt:Number;
	private var downArrowHt:Number;
	private var sBuffer:Number;

	public function Scrollbar():void {
		scroller.addEventListener(MouseEvent.MOUSE_DOWN, dragScroll);
		stage.addEventListener(MouseEvent.MOUSE_UP, stopScroll);			
		stage.addEventListener(MouseEvent.MOUSE_WHEEL,mouseWheelHandler);
	}
	//
	public function init(t:MovieClip, tr:String,tt:Number,sa:Boolean,b:Number):void {
		target = t;
		trans = tr;
		timing = tt;
		isArrow = sa;
		sBuffer = b;
		if (target.height <= track.height) {
			this.visible = false;
		}			

		//
		upArrowHt = upArrow.height;
		downArrowHt = downArrow.height;
		if (isArrow) {
			top = scroller.y;
			dragBot = (scroller.y + track.height) - scroller.height;
			bottom = track.height - (scroller.height/sBuffer);

		} else {
			top = scroller.y;
			dragBot = (scroller.y + track.height) - scroller.height;
			bottom = track.height - (scroller.height/sBuffer);

			upArrowHt = 0;
			downArrowHt = 0;
			removeChild(upArrow);
			removeChild(downArrow);
		}
		range = bottom - top;
		sRect = new Rectangle(0,top,0,dragBot);
		ctrl = target.y;
		//set Mask
		isUp = false;
		isDown = false;
		arrowMove = 10;

		if (isArrow) {
			upArrow.addEventListener(Event.ENTER_FRAME, upArrowHandler);
			upArrow.addEventListener(MouseEvent.MOUSE_DOWN, upScroll);
			upArrow.addEventListener(MouseEvent.MOUSE_UP, stopScroll);
			//
			downArrow.addEventListener(Event.ENTER_FRAME, downArrowHandler);
			downArrow.addEventListener(MouseEvent.MOUSE_DOWN, downScroll);
			downArrow.addEventListener(MouseEvent.MOUSE_UP, stopScroll);
		}
		var square:Sprite = new Sprite();
		square.graphics.beginFill(0xFF0000);
		square.graphics.drawRect(target.x, target.y, target.width+5, (track.height+upArrowHt+downArrowHt));
		parent.addChild(square);			
		target.mask = square;

	}
	public function upScroll(event:MouseEvent):void {
		isUp = true;
	}
	public function downScroll(event:MouseEvent):void {
		isDown = true;
	}
	public function upArrowHandler(event:Event):void {
		if (isUp) {
			if (scroller.y > top) {
				scroller.y-=arrowMove;
				if (scroller.y < top) {
					scroller.y = top;
				}
				startScroll();
			}
		}
	}
	//
	public function downArrowHandler(event:Event):void {
		if (isDown) {
			if (scroller.y < dragBot) {
				scroller.y+=arrowMove;
				if (scroller.y > dragBot) {
					scroller.y = dragBot;
				}
				startScroll();
			}
		}
	}
	//
	public function dragScroll(event:MouseEvent):void {			
		scroller.startDrag(false, sRect);
		stage.addEventListener(MouseEvent.MOUSE_MOVE, moveScroll);
	}
	//
	public function mouseWheelHandler(event:MouseEvent):void {
		if (event.delta < 0) {
			if (scroller.y < dragBot) {
				scroller.y-=(event.delta*2);
				if (scroller.y > dragBot) {
					scroller.y = dragBot;
				}
				startScroll();
			}
		} else {
			if (scroller.y > top) {
				scroller.y-=(event.delta*2);
				if (scroller.y < top) {
					scroller.y = top;
				}
				startScroll();
			}
		}
	}
	//
	public function stopScroll(event:MouseEvent):void {
		isUp = false;
		isDown = false;
		scroller.stopDrag();

		stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveScroll);
	}
	//
	public function moveScroll(event:MouseEvent):void {
		startScroll();

	}
	public function startScroll():void {
		ratio = (target.height - range)/range;
		sPos = (scroller.y * ratio)-ctrl;

		Tweener.addTween(target, {y:-sPos, time:timing, transition:trans});
	}
}
}

 

 

Código de carregamento do XML:

 

package {

import flash.display.MovieClip;
import flash.text.TextField;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.Event;

public class CarregaXml extends MovieClip {

	private var endTxt:URLRequest;
	private var loadTxt:URLLoader;
	private var meuXml:XML;

	public function CarregaXml():void {
		endTxt = new URLRequest("xml/agenda.xml")
		loadTxt = new URLLoader(endTxt);
		loadTxt.addEventListener(Event.COMPLETE, carregaTxt);
	}

	public function carregaTxt(e:Event):void{
		meuXml = XML(loadTxt.data);
		txt_mc.campoTexto.text = meuXml;
		var saidaTexto:String = "";
		var registros:uint = meuXml.id.length();
		for (var cont:int = 0; cont < registros; cont++){
			saidaTexto += meuXml.id[cont].dia+"       ";
			saidaTexto += meuXml.id[cont].titulo+"\n\n";
		}
		txt_mc.campoTexto.text = saidaTexto;
		loadTxt.addEventListener(Event.COMPLETE, mostraXml);
	}

	public function mostraXml(e:Event):void {
		txt_mc.campoTexto.text = e.target.data;
		txt_mc.campoTexto.autoSize = "left";
		sb.init(txt_mc.campoTexto, "easeOutBack", 2, true, 1.5);
	}
}
}

 

 

Certamente pelo erro eu estou chamando algo no tempo errado, mas pq o erro faz referência ao startScroll() e moveScroll()??

 

Agradeço respostas.

 

 

Valews,

Angelito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho esse arquivo funcionando com um txt externo, vou dar uma olhada no uso com XML.

 

Melhor que algum colega mais experiente possa dar um toque, estou aprendendo o uso de classes.

 

 

EDITADO >> para teste do arquivo

 

Usei sua classe para carregar o XML. Criei a pasta 'xml' e renomeei um dos meus arquivos como 'agenda.xml'. Fiz o Embedding (uso o CS5).

 

Talvez meu XML não seja adequado, mas...

 

Resultado: não carregou nada e ao clicar sobre o 'scroller' o movie clip é deslocado de forma inadequada, fora da área de rolagem, e exibe em output o mesmo erro que você mencionou.

 

scrollxml.th.jpg

 

 

Então, testar sem carregar fica difícil. Vou dar uma conferida em outros exemplos que tenho de scroll com XML, mas não são com uso de classes.

 

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é Elektra, também funciona corretamente pra mim se for puxado de TXTs, mas XML...

Pra mim as informações do XML estão carregando sem problema, mas o erro, bem como a rolagem que sai da posição, também ocorrem.

 

Valeu pelo esforço pra ajudar, mesmo assim!

 

 

Abs..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou aprendendo AS3 e tenho outros exemplos de scroll com XML, vamos ver se consigo converter para uma classe ou encontro algum template.

 

Vou revirar o meu backup, isso também me interessa muito.

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.