quinta-feira, 2 de agosto de 2018

JavaFx - a classe AnimationTimer

A classe AnimationTimer permite criar um
temporizador, que é chamado em cada quadro
enquanto está ativo. Uma classe de extensão deve
substituir o identificador de método (longo), 
que será chamado em cada quadro.
Os métodos start () e stop ()
que pertencem a classe,

permitem iniciar e parar o temporizador.
Para criarmos uma animação,
precisamos alterar as propriedades do nó,
como tamanho, localização, cor, etc...
Conforme o tempo passa, a animação
da timeline (linha do tempo),
atualiza os valores da propriedade.
Aqui estamos mostrando um simples exemplo
de animação usando a classe abstrata
AnimationTimer, onde um lindo falcão
voa tranquilamente no céu,
ele voa nos limites da tela e faz seu retorno

antes de colidir nas margens.
Mas isto é coisa muito simples perto
do que se pode fazer com a riqueza de recursos

das classes de animação.

Veja abaixo uma imagem do programa em execução:









Veja abaixo um vídeo do programa funcionando:


Veja abaixo o código do programa:



import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class PROJETO extends Application {
     Canvas canvas = new Canvas ( 600, 360 );
     GraphicsContext ctx = canvas.getGraphicsContext2D ( );
     Pane root = new Pane ( );
     Scene scene = new Scene ( root );
     //retorna o valor atual do timer do sistema
     //disponível mais preciso, em nanossegundos
     final long startNanoTime = System.nanoTime ( );
     Boolean a = false;
     Text t = new Text ( );
     Text t_1 = new Text ( );
     // /////////////////////////////////////////////////////////////////////////
     public void Informe ( ) {
         t.setFont ( Font.font ( null, FontWeight.BOLD,
                   FontPosture.ITALIC, 22 ) );
         t.setCache ( true );
         t.setX ( 120.0 );
         t.setY ( 40.0 );
         t.setFill ( Color.BLACK );
         t.setText ( "JAVAFX - USANDO AnimationTimer" );
         t_1.setFont ( Font.font ( "Arial", FontWeight.NORMAL, 13 ) );
         t_1.setX ( 240 );
         t_1.setY ( 290 );
         t_1.setFill ( Color.BLACK );
         t_1.setText ( "Por: Samuel Lima\n"
                   + "sa_sp10@hotmail.com\n\n"
                   +"  MUITO OBRIGADO");    
     }
     // ////////////////////////////////////////////////////////////////////////
     public void flyingFalcao (  ) throws FileNotFoundException {
         // Carregando a imagem
         Image falcao_1 = new Image ( new FileInputStream (
                   "H:\\eclipse luna_two\\" + "PROJETO\\PROJETO\\src\\"
                            + "Foto\\flyingEagle_1.gif" ) );
         Image falcao_2 = new Image ( new FileInputStream (
                   "H:\\eclipse luna_two\\" + "PROJETO\\PROJETO\\src\\"
                            + "Foto\\flyingEagle_2.gif" ) );    
         Image ceu = new Image ( new FileInputStream (
                   "H:\\eclipse luna_two\\" + "PROJETO\\PROJETO\\src\\"
                            + "Foto\\céu.png" ) );
         new AnimationTimer ( ) {
              public void handle ( long currentNanoTime ) {
                   double timer = ( currentNanoTime - startNanoTime ) / 1000000000.0;
                   //Estes casts foram necessário para calcular-mos
                   //as corrdenadas para a troca das imagens do falcão
                   int x = ( int ) ( 155 + 260 * Math.cos ( timer ) );
                   int y = ( int ) ( 150 + 50 * Math.sin ( timer ) );              
                   ctx.drawImage ( ceu, 15, 15, 570, 330 );               
                   if ( a == false && x <= 414 ) {
                        ctx.drawImage ( falcao_2, x + 110, y, 53, 53 );
                        if ( x < -100 )
                            a = true;
                   }
                   if ( a == true  ){    
                        ctx.drawImage ( falcao_1, x + 110, y, 53, 53 );
                        if ( x == 414 )
                            a = false;
                   }                 
                   //System.out.println ( x  );
              }
         }.start ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public void start ( Stage stage ) throws FileNotFoundException {
         stage.setTitle ( "JAVAFX - USANDO AnimationTimer" );
         // Usando fonte em italic
         ctx.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 15 ) );
         // Criando uma moldura retangular em canvas
         ctx.setStroke ( Color.BLACK );
         ctx.setLineWidth ( 10.0 );
         ctx.strokeRoundRect ( 10, 10, 580, 340, 10, 10 );
         flyingFalcao (  );
         Informe ( );
         root.getChildren ( ).addAll ( canvas, t, t_1 );
         stage.setScene ( scene );      
         stage.show ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public static void main ( String [ ] args ) {
         launch ( );
     }
}

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.