-
/**
-
* Classe que implementa a função a scroll simplificada
-
* Somente foi tratado o scroll vertical
-
* @author Guilherme Moschen
-
* @version 1.0
-
*/
-
-
package com.cubagames.util {
-
-
import flash.display.DisplayObject;
-
import flash.display.Sprite;
-
import flash.events.MouseEvent;
-
import flash.geom.Point;
-
import flash.geom.Rectangle;
-
-
public class Scroll {
-
private var bolaScroll:Sprite;
-
private var areaScroll:Rectangle;
-
private var conteudo:DisplayObject;
-
private var posicaoInicialBolaScroll:Point;
-
private var botaoCima:DisplayObject;
-
private var botaoBaixo:DisplayObject;
-
private var mousePressionado:Boolean;
-
private var alturaConteudo:int;
-
private var precisaScroll:Boolean;
-
-
// Seta a velocidade do Scroll quando é usado os botões para deslizar o conteúdo
-
public static var VELOCIDADE_SCROLL:int = 9;
-
-
/**
-
* Construtora da classe
-
* @param bolaScroll - Sprite que representa a bola(ou outra forma) do scroll. O bola do scroll sempre deslizará para baixo, a distância de deslizamento é a altura da areaScroll
-
* @param areaScroll - Rectangle que representa a area do scroll, funciona da mesma forma que o efeito clipping em Sprite. A posição X e Y do scroll deve-se ser 0, pois essa será posição inicial do clipping dentro do conteúdo.
-
* @param conteudo - O conteúdo que será implementado o scroll
-
* @param botaoCima - Botão que representa a seta superior do scroll
-
* @param botaoBaixo - Botão que representa a seta inferior do scroll
-
*/
-
public function Scroll( bolaScroll:Sprite, areaScroll:Rectangle, conteudo:DisplayObject, botaoCima:DisplayObject, botaoBaixo:DisplayObject ):void {
-
this.bolaScroll = bolaScroll;
-
this.areaScroll = areaScroll;
-
this.conteudo = conteudo;
-
this.botaoCima = botaoCima;
-
this.botaoBaixo = botaoBaixo;
-
this.mousePressionado = false;
-
-
// Não precisa de scroll, se a altura do conteúdo for menor que a altura do scroll
-
if ( this.conteudo.height <this.areaScroll.height )
-
this.precisaScroll = false;
-
else
-
this.precisaScroll = true;
-
-
if ( this.precisaScroll ) {
-
// Salva a posição inicial da bola da Scroll para sempre saber quanto foi o descolamento desde o ponto inicial até a posição atual da bola do scroll
-
this.posicaoInicialBolaScroll = new Point(this.bolaScroll.x, this.bolaScroll.y);
-
-
//Quando é setado um scroll para um DisplayObject a altura e largura, viram a altura e largura do scroll. Salva-se então para saber o tamanho real do conteúdo
-
this.alturaConteudo = this.conteudo.height;
-
// Tratamento feito para sempre ter metada do conteúdo aparecendo na tela
-
if ( this.alturaConteudo> this.areaScroll.height )
-
this.alturaConteudo -= this.areaScroll.height/2;
-
-
// Adiciona os eventos do mouse
-
this.bolaScroll.addEventListener( MouseEvent.MOUSE_DOWN, this.bolaScroll_Down);
-
this.bolaScroll.stage.addEventListener(MouseEvent.MOUSE_UP, this.stage_Up);
-
// Seta a área do scroll no conteúdo.
-
this.conteudo.scrollRect = this.areaScroll;
-
}
-
else
-
this.bolaScroll.visible = false;
-
}
-
-
/**
-
* Método que reajusta as novas posições do scroll e do conteúdo
-
*/
-
public function ajustaScroll():void {
-
// Botões
-
if ( this.precisaScroll ) {
-
// É trada dessa forma para que o usuário não tenha que ficar clicando para baixar ou subir o conteúdo.
-
// Não foi utilizado os eventos porque, caso fosse usados, eles seriam envocados apenas uma vez
-
if ( !this.mousePressionado ) {
-
if ( this.botaoCima.hitTestPoint(this.botaoCima.stage.mouseX, this.botaoCima.stage.mouseY) && this.bolaScroll.y> this.posicaoInicialBolaScroll.y ) {
-
this.bolaScroll.y -= Scroll.VELOCIDADE_SCROLL;
-
if ( this.bolaScroll.y <this.posicaoInicialBolaScroll.y )
-
this.bolaScroll.y = this.posicaoInicialBolaScroll.y;
-
}
-
else if ( this.botaoBaixo.hitTestPoint(this.botaoBaixo.stage.mouseX, this.botaoBaixo.stage.mouseY) && this.areaScroll.y <this.alturaConteudo ) {
-
this.bolaScroll.y += Scroll.VELOCIDADE_SCROLL;
-
if ( this.bolaScroll.y> this.posicaoInicialBolaScroll.y + this.areaScroll.height )
-
this.bolaScroll.y = this.posicaoInicialBolaScroll.y + this.areaScroll.height;
-
}
-
}
-
-
// Regra de 3 para saber a porcentagem do deslocamento desde o ponto inicial até a posição atual da bola do scroll
-
var variacao:Number = this.areaScroll.height - (this.bolaScroll.y - this.posicaoInicialBolaScroll.y);
-
variacao = 1 - (variacao / this.areaScroll.height);
-
this.areaScroll.y = this.alturaConteudo * variacao;
-
// Atualiza o scroll
-
this.conteudo.scrollRect = this.areaScroll;
-
}
-
}
-
-
/**
-
* Método que implementa o tratamento do evento MOUSE_DOWN, quando o botão do mouse estiver pressionado, a bola do scroll
-
* @param event - Evento
-
*/
-
private function bolaScroll_Down( event:MouseEvent ):void {
-
this.mousePressionado = true;
-
this.bolaScroll.startDrag(false, new Rectangle(this.posicaoInicialBolaScroll.x, this.posicaoInicialBolaScroll.y, 0, this.areaScroll.height));
-
}
-
-
/**
-
* Método que implementa o tratamento do evento MOUSE_UP, quando o botão do mouse for solto(released)
-
* O evento foi adicionado no stage para que ele possa ser trato em qualquer parte do SWF
-
* @param event - Evento
-
*/
-
private function stage_Up( event:MouseEvent ):void {
-
this.mousePressionado = false;
-
this.bolaScroll.stopDrag();
-
}
-
}
-
}