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.