JavaFX示例--TimeLine和Animation的使用

22 篇文章 30 订阅

  这两天工作很忙,由于要进行Android平板上的一个项目的final release,前天晚上加班到11点多,昨天晚上加班到凌晨4点多。所以之前说的Sourceforge的首页也才做了一部分。不过,由于项目final release,今天比较轻松,写了几个JavaFX的示例。


  

  

  上面就是一个简单的示例。

  

  示例的演示地址:http://wjfxgame.sourceforge.net/examples/exp1/AniTest.html


   点击Start开始动画。


 主要是应用了JavaFX中的Timeline和Animation。

  Timeline在之前的博文中,很多地方用到了。也就是一个时间轴,然后通过添加关键帧来形成动画。


  而Animation,主要是对Node进行动画处理。JavaFX中的动画在javafx.animation包中。而Animation有两个子类,Timeline和Transition。也就是说,按照API中的层级关系来看,Timeline是Animation的一种。


  当然,我们也就不必纠结标题中的Timeline和Animation了。


  Transition共有10个子类,分别是:FadeTransition, FillTransition, ParallelTransition, PathTransition, PauseTransition, RotateTransition, ScaleTransition, SequentialTransition, StrokeTransition, TranslateTransition。


  其实子类虽多,但动画的基本效果都可以根据命名前缀来判断。基本都是Node属性的改变,像边框色,填充色,透明度,缩放,旋转,平移,按路径移动和暂停。


  只有ParallelTransition是并行动画(一系列动画同时进行),SequentialTransition是顺序动画(一系列动画按顺序执行)。


  下面看一下源代码:

  

import javafx.animation.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.effect.Bloom;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.util.Duration;

/**
 *
 * @author wing
 */
public class TestPane extends Pane{
    private ParallelTransition mAnimList;
    
    private Timeline timeline;
    
    private HBox hBox;
    private ToggleButton start, pause, stop;
    private ToggleGroup btnGroup;
    
    private double duration = 200;
    public TestPane(){
        btnGroup = new ToggleGroup();
        start = new ToggleButton("Start");
        start.setToggleGroup(btnGroup);
        start.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                timeline.play();
                checkUIState();
            }
        });
        
        pause = new ToggleButton("Pause");
        pause.setToggleGroup(btnGroup);
        pause.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                timeline.pause();
                checkUIState();
            }
        });       
 
        stop = new ToggleButton("Stop");
        stop.setToggleGroup(btnGroup);
        stop.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                timeline.stop();
                checkUIState();
            }
        });   
        
        hBox = new HBox(10);
        hBox.getChildren().addAll(start, pause, stop);
        
        hBox.setTranslateX((Anitest.WIDTH - 200) / 2);
        hBox.setTranslateY(20);
        
        getChildren().add(hBox);
        
        
        timeline = new Timeline();
        
        timeline.setCycleCount(Timeline.INDEFINITE);
        KeyFrame keyFrame = new KeyFrame(Duration.millis(duration), new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                createObject();
            }
        });
        timeline.getKeyFrames().add(keyFrame);
    }
    
    /**
     * 检测start pause stop三个按钮的状态
     */
    public void checkUIState(){
        start.setDisable(false);
        pause.setDisable(false);
        stop.setDisable(false);
        switch(timeline.getStatus()){
            case RUNNING:
                start.setDisable(true);
                break;
            case PAUSED:
                pause.setDisable(true);
                break;
            case STOPPED:
                stop.setDisable(true);
                break;
        }
    }
    
    
    /**
     * 创建一个Object 并执行动画,在这里创建了一个ParallelTransition,并在其中添加了随机左右上下平移的TranslateTransition,透明度逐渐变为0的FadeTransition和逐渐放大0.2倍的ScaleTransition。将刚创建的Object与组合这个三个动画的ParallelTransition绑定,然后执行ParallelTransition。
     */
    public void createObject() {
        double width = Math.max(50, Math.random() * 200);
        double height = Math.max(50, Math.random() * 200);        
        double x = Math.min(Math.random() * Anitest.WIDTH, Anitest.WIDTH - width);
        double y = Math.max(Math.random() * (Anitest.HEIGHT - 100), 100);
        
        double dx = Math.random() * 50;
        double dy = Math.random() * 50;
        final Shape shape = new Circle(x, y, width / 2);
        shape.setEffect(new Bloom(50));
        shape.setFill(Color.rgb((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255)));
        getChildren().add(shape);
        mAnimList = new ParallelTransition(
                shape,
                TranslateTransitionBuilder.create().byX(Math.random() > 0.5 ? dx : -dx).byY(Math.random() > 0.5 ? dy : -dy).duration(Duration.millis(1000)).build(),
                FadeTransitionBuilder.create().toValue(0).duration(Duration.millis(1000)).build(),
                ScaleTransitionBuilder.create().byX(0.2).byY(0.2).duration(Duration.millis(800)).build());
        mAnimList.play();
        mAnimList.setOnFinished(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                getChildren().remove(shape);
            }
        });
    }
}


  并在动画结束的时候,将刚创建的Object进行移除操作。


  这里的Transition都是用各自的Builder来创建。


  至于为何这里会继承Pane,主要是这些示例我之后都会加进Sourceforge首页的站点中,在那个App里会使用到。


  下面是Main类:

  

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 * @author wing
 * 2012/8/30
 */
public class Anitest extends Application {
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        TestPane mPane = new TestPane();
        StackPane root = new StackPane();
        root.getChildren().add(mPane);
        Scene scene = new Scene(root, WIDTH, HEIGHT);
        scene.setFill(Color.BLACK);
        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX示例--TimeLine和Animation的使用");
        primaryStage.show();
    }
}

  Main类就不做解释了,都是很基本的内容。


    转载请注明出处:http://blog.csdn.net/ml3947/

---------------------------------------------------------

  本来是尝试在博文中嵌入Applet,尝试了半天没成功,但是又看到以前一直关注的一位牛人博客里嵌入过。顿感奇怪中。准备以后再看看。


  所以就直接给了演示的地址。如果系统没安装JavaFX的时候,应该会提示你安装新版Java去。因为JRE7中已经包含了JavaFX了。

  

  

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaFX中,可以使用Timeline类来创建动画。要改变动画的播放速度,可以通过设置Timeline的rate属性来实现。 具体来说,可以按照以下步骤进行操作: 1. 创建一个Timeline对象。 2. 设置Timeline的关键帧(KeyFrame),定义动画的起始状态和结束状态。 3. 调用Timeline的setRate方法,设置动画的播放速度。默认速度为1.0,设置为2.0表示加快两倍,设置为0.5表示减慢一半,以此类推。 以下是一个示例代码,演示如何使用Timeline改变动画的播放速度: ```java import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage; import javafx.util.Duration; public class AnimationDemo extends Application { @Override public void start(Stage stage) { // 创建一个圆形,并设置其属性 Circle circle = new Circle(50, 50, 30); circle.setFill(Color.RED); // 创建一个Timeline对象,设置关键帧(KeyFrame),并设置播放速度 Timeline timeline = new Timeline( new KeyFrame(Duration.seconds(0), event -> { circle.setTranslateX(0); }), new KeyFrame(Duration.seconds(2), event -> { circle.setTranslateX(300); }) ); timeline.setRate(0.5); // 设置播放速度为0.5,即减慢一半 // 创建一个Group对象,将圆形添加到其中 Group root = new Group(); root.getChildren().add(circle); // 创建一个场景,并将Group对象添加到其中 Scene scene = new Scene(root, 400, 300); // 将场景添加到舞台,并显示舞台 stage.setScene(scene); stage.show(); // 启动动画 timeline.play(); } public static void main(String[] args) { launch(args); } } ``` 在上面的示例代码中,我们创建了一个圆形,并使用Timeline定义了一个从左到右的动画。然后,我们使用timeline.setRate方法将播放速度设置为0.5,即减慢一半。最后,我们启动了动画。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值