terça-feira, 25 de setembro de 2018

JavaFX - animando string

Os programadores de java podem fazer
animações impressionante usando JavaFX.
Aqui está um simples exemplo disto mas que 
pode ser grandemente melhorado pelos mais
experientes na linguagem.
Neste exemplo estamos animando uma string,
que recebeu um efeito que imita um efeito  3D,
com .css numa janela transparente do JavaFX.
O vídeo foi gravado  quase em tela inteira
numa resolução em HD, e o código é oferecido
aos admiradores de java e que se impressiona
com a poderosa biblioteca JavaFX assim como eu.

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



Veja abaixo um vídeo com o programa funcionando:


Veja abaixo o código do programa:


import javafx.animation.Animation;
import javafx.animation.AnimationTimer;
import javafx.animation.KeyFrame;
import javafx.animation.RotateTransition;
import javafx.animation.Timeline;
import javafx.animation.Transition;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Duration;
import javafx.animation.KeyValue;

public class PROJETO extends Application {
     private Timeline videoTick;
     private Timeline timeline;
     String a = "JAVAFX";
     StackPane stack = new StackPane ( );
     int i = 0, k = 0, l = 0, load = 1000;
     Canvas canvas = new Canvas ( 1280, 1000 );
     GraphicsContext ctx = canvas.getGraphicsContext2D ( );
     // Criando um Group object
     Group root = new Group ( );
     // Criando o scene object transparente;
     Scene scene = new Scene ( root, 1280, 1000, Color.TRANSPARENT );
     Text t_1 = new Text ( );
     Text t = new Text ( );
     RotateTransition rot_1 = new RotateTransition ( );
     RotateTransition rot_2 = new RotateTransition ( );
     Rotate rotateX_1 = new Rotate ( 20.0, Rotate.X_AXIS );
     Rotate rotateZ_1 = new Rotate ( 10.0, Rotate.Z_AXIS );
     Rotate rotateY_1 = new Rotate ( 30.0, Rotate.Y_AXIS );

     Rotate rotateX_2 = new Rotate ( 20.0, Rotate.X_AXIS );
     Rotate rotateZ_2 = new Rotate ( 10.0, Rotate.Z_AXIS );
     Rotate rotateY_2 = new Rotate ( 30.0, Rotate.Y_AXIS );
     Circle btn_1 = new Circle ( 150, 300, 20 );
     // /////////////////////////////////////////////////////////////////////////
     public void Informe ( ) {
         ctx.setFont ( Font.font ( "Arial", FontWeight.NORMAL, 13 ) );
         ctx.setFill ( Color.RED );
         ctx.fillText ( "Por: ", 250, 275 );
         ctx.setFill ( Color.BLUE );
         ctx.fillText ( "Samuel Lima", 280, 275 );
         ctx.setFill ( Color.BLACK );
         ctx.fillText ( "sa_sp10@hotmail.com", 250, 290 );
         ctx.setFill ( Color.RED );
         ctx.fillText ( "MUITO OBRIGADO", 250, 320 );
     }
     // /////////////////////////////////////////////////////////////////////////
     public void efeito_zoom ( ) {
         t = new Text ( a );
         //Usando fonte em italic
         t.setFont ( Font.font ( "Verdana", FontWeight.BOLD,
                   FontPosture.ITALIC, 20 ) );
         t.setStroke ( Color.BLUE );
         t.setFill ( Color.BLUE );
         t.setRotate ( -30 );
         t.setStyle ( " -fx-effect: dropshadow( one-pass-box ,"          
                   + " rgba(0,0,139) , 2, 2.0 , 0 , 2 );");
         // Definindo a duração da transição
         rot_1.setDuration ( Duration.millis ( 3000 ) );    
         // Configurando o nó para a transição
         rot_1.setNode ( t );
         // Ajustando o eixo da rotação
         //rot_1.setAxis ( Rotate.X_AXIS );
         rot_1.setAxis ( Rotate.Y_AXIS );
         //rot_1.setAxis ( Rotate.Z_AXIS );
         // Ajustando o ângulo da rotação
         rot_1.setByAngle ( 360 );
         rot_1.setCycleCount ( 10 );
         // Configurando o valor do reverso automático
         // para falso
         rot_1.setAutoReverse ( true );
         // Iniciando a rotaão
         rot_1.play ( );
         root.setTranslateX ( 480 );
         root.setTranslateY ( 160 );
         timeline = new Timeline ( );
         timeline.setCycleCount ( Timeline.INDEFINITE );
         timeline.setAutoReverse ( true );
         new AnimationTimer ( ) {
              @Override
              public void handle ( long l ) {
                   l = 2000000000;
                   t.setText ( a.toString ( ) );
                   i++;
              }
         };
         stack.setLayoutX ( 30 );
         stack.setLayoutY ( 30 );   
         KeyValue keyValueX = new KeyValue ( stack.scaleXProperty ( ), 14 );
         KeyValue keyValueY = new KeyValue ( stack.scaleYProperty ( ), 14 );
         Duration duration = Duration.millis ( 2000 );
         KeyFrame keyFrame = new KeyFrame ( duration, keyValueX, keyValueY );          
         timeline.getKeyFrames ( ).add ( keyFrame );
         timeline.play ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     // Método usado como clock criado por mim
     public int Sleep ( int x ) {
         Duration duration = Duration.millis ( x );
         videoTick = new Timeline ( new KeyFrame ( duration,
                   new EventHandler < ActionEvent > ( ) {
              public void handle ( ActionEvent actionEvent ) {
                   k++;
                   System.out.println ( k );
                   if ( k == 2 )
                        cria_efeito_1 ( );
                   if ( k == 32 ) {
                        timeline.pause ( );
                        rot_1.pause ( );
                   }
              }
         } ) );
         videoTick.setCycleCount ( Animation.INDEFINITE );
         videoTick.playFromStart ( );
         return k;
     }
     // /////////////////////////////////////////////////////////////////////////
     public void button_person_1 ( ) {
         EventHandler < MouseEvent > eventHandler_1 =
                   new EventHandler < MouseEvent > ( ) {
              @Override
              public void handle ( MouseEvent e ) {
                   if ( i == 0 ) {
                        timeline.pause ( );
                        rot_1.pause ( );
                        rot_2.pause ( );
                        i = 0;
                        System.out.println ( "Pausado" );
                        btn_1.setFill ( Color.rgb ( 29, 111, 0 ) );
                        i++;
                   } else {
                        timeline.play ( );
                        rot_1.play ( );
                        rot_2.play ( );
                        System.out.println ( "Ligado" );
                        btn_1.setFill ( Color.rgb ( 0, 255, 0 ) );
                        i = 0;
                   }
              }
         };
         btn_1.setFill ( Color.rgb ( 0, 255, 0 ) );
         btn_1.addEventFilter ( MouseEvent.MOUSE_CLICKED, eventHandler_1 );
     }
     // /////////////////////////////////////////////////////////////////////////
     public void cria_efeito_1 ( ) {
         t_1.setFill ( Color.BLUE );
         // Usando fonte em italic
         t_1.setFont ( Font.font ( "Verdana", FontWeight.BOLD,
                   FontPosture.ITALIC, 240 ) );
         t_1.setX ( 40 );
         t_1.setY ( 150 );
         t_1.setTranslateX ( -400 );
         t_1.setTranslateY ( 100 );
         t_1.setRotate ( 0 );
         // Colocando efeito na fonte com css
         t_1.setStyle ( "-fx-font-weight: bold;"
                   + " -fx-effect: dropshadow( three-pass-box ,"
                   + " rgba(0,0,139) , 10, 2.0 , 0 , 11 );" );
         // Definindo a duração da transição
         rot_2.setDuration ( Duration.millis ( 3000 ) );
         // Configurando o nó para a transição
         rot_2.setNode ( t_1 );
         // Ajustando o eixo da rotação
         // rot_1.setAxis ( Rotate.X_AXIS );
         rot_2.setAxis ( Rotate.Y_AXIS );
         // rot_1.setAxis ( Rotate.Z_AXIS );
         // Ajustando o ângulo da rotação
         rot_2.setByAngle ( 360 );
         // Definindo a contagem de ciclos
         // para finalizar em 50 segundos
         rot_2.setCycleCount ( 10 );
         // Configurando o valor do reverso automático
         // para falso
         rot_2.setAutoReverse ( true );
         // Iniciando a rotaão
         rot_2.play ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public void cria_anime_1 ( ) {
         t_1.setFill ( Color.BLUE );
         // Usando fonte em italic
         t_1.setFont ( Font.font ( "Verdana", FontWeight.BOLD,
                   FontPosture.ITALIC, 240 ) );
         t_1.setX ( 40 );
         t_1.setY ( 150 );
         t_1.setTranslateX ( -400 );
         t_1.setTranslateY ( 100 );
         t_1.setRotate ( 0 );
         // Colocando efeito na fonte com css
         t_1.setStyle ( "-fx-font-weight: bold;"
                   + " -fx-effect: dropshadow( three-pass-box ,"
                   + " rgba(0,0,139) , 10, 2.0 , 0 , 11 );" );
         final String content = "JAVAFX";
         final Animation animation = new Transition ( ) {
              {
                   setCycleDuration ( Duration.millis ( 2000 ) );
              }
              protected void interpolate ( double frac ) {
                   final int length = content.length ( );
                   final int n = Math.round ( length * ( float ) frac );
                   t_1.setText ( content.substring ( 0, n ) );
              }
         };
         animation.play ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public void start ( Stage stage ) {
         stage.initStyle ( StageStyle.TRANSPARENT );
         cria_anime_1 ( );
         efeito_zoom ( );
         Sleep ( load );
         button_person_1 ( );
         // Informe ( );
         t.getTransforms ( ).addAll ( rotateX_1, rotateZ_1, rotateY_1 );
         t_1.getTransforms ( ).addAll ( rotateX_2, rotateZ_2, rotateY_2 );
         root.getChildren ( ).addAll ( canvas );
         stack.getChildren ( ).addAll ( t );
         root.getChildren ( ).addAll ( stack, t_1, btn_1 );
         // Adicionando o scene para o satge
         stage.setScene ( scene );
         // Exibindo o conteúdo do stage
         stage.show ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public static void main ( String args [ ] ) {
         launch ( args );
     }
}
 

Nenhum comentário:

Postar um comentário

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