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 );
}
}