Botão animado com Ginga-J

Criei um componente para facilitar a exibições de botões animados com Ginga-J. É uma classe pequena onde você passa um array de imagens e adiciona no seu Form principal e ela anima essas imagens. A implementação é simples pois utiliza o framework de animação do LWUIT. Então é só criar uma classe que herda o botão do LWUIT e sobreescrever o método "animate" e "paint":

package org.gvlabs.sbtvd.control.ui;

import com.sun.dtv.lwuit.Button;
import com.sun.dtv.lwuit.Graphics;
import com.sun.dtv.lwuit.Image;

public class AnimatedButton extends Button {
	private int speed = 50;

	private Image[] animaImgs;

	private int currentImage = 0;
	private long lastInvoke;
	private boolean forward = true;
	private boolean backAndForth = true;
	private boolean loop = true;
	private boolean disableLoop = false;

	public AnimatedButton() {
	}

	public Image[] getAnimaImgs() {
		return animaImgs;
	}

	public void setAnimaImgs(Image[] animaImgs) {
		this.animaImgs = animaImgs;
		if (animaImgs != null && animaImgs.length > 0) {
			this.setIcon(animaImgs[0]);
		}
	}

	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}

	public boolean isBackAndForth() {
		return backAndForth;
	}

	public void setBackAndForth(boolean backAndForth) {
		this.backAndForth = backAndForth;
	}

	public boolean isLoop() {
		return loop;
	}

	public void setLoop(boolean loop) {
		this.loop = loop;
	}

	public boolean animate() {
		if (disableLoop)
			return false;
		long current = System.currentTimeMillis();
		if (current - lastInvoke > speed) {
			lastInvoke = current;
			if (forward) {
				currentImage++;
			} else {
				currentImage--;
			}
			if (currentImage >= animaImgs.length) {
				if (!loop) {
					disableLoop = true;
					return false;
				} else if (!backAndForth) {
					forward = true;
					currentImage = 0;
				} else {
					forward = false;
					currentImage = animaImgs.length - 1;
				}
			} else if (currentImage < 0) {
				forward = true;
				currentImage = 0;
			}
			return true;
		}
		return false;
	}

	public void paint(Graphics g) {
		g.drawImage(animaImgs[currentImage], getX(), getY());
	}

}

A lógica da animação se encontra no método animate e o método paint desenha a imagem no componente. O método setSpeed atribui a velocidade de animação entre as imagens em milissegundos. O método setLoop faz com que a animação se torne em loop ou seja executada uma única vez e o método setBackAndForth, diz se a animação irá ir do começo ao fim e depois do fim ao começo ou se sempre ao chegar ao fim inicia a exibição da primeira imagem.

Para executar, basta carregar as imagens (linha 3 a 8), passar para o componente (linha 9), adiciona-lo em um Form (linha 10) e registrar a animação (linha 11). Por exemplo:

			Form f = new Form();
			AnimatedButton aniBtn = new AnimatedButton();
			Image[] animaImgs = new Image[17];
			for (int idx = 0; idx < animaImgs.length; idx++) {
				animaImgs[idx] = Image
						.createImage("img/T" + (idx + 1) + ".gif");

			}
			aniBtn.setAnimaImgs(animaImgs);
			f.addComponent(aniBtn);
			f.registerAnimation(aniBtn);
			f.show();

Nesse exemplo eu carrego 17 imagens que estão na pasta img com os nomes T1.gif, T2.gif, ... T17.gif e exibo no formulário. Agora é só curtir o botão animado.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6