Animation动画 Timeline

ToggleButton play = new ToggleButton("play");  
ToggleButton pause = new ToggleButton("pause");  
ToggleButton stop = new ToggleButton("stop");  
ToggleButton action = new ToggleButton("action");  
ToggleButton print = new ToggleButton("print");  
ToggleGroup toggleGroup = new ToggleGroup();  
play.setToggleGroup(toggleGroup);  
pause.setToggleGroup(toggleGroup);  
stop.setToggleGroup(toggleGroup);  
action.setToggleGroup(toggleGroup);  
print.setToggleGroup(toggleGroup);  
HBox hBox = new HBox(30);  
hBox.getChildren().addAll(play, pause, stop, action, print);

动画

  • 创建时间线动画,帧率为60(默认)Timeline timeline = new Timeline(60);

  • 创建时间点

    // kf1配合kf2,效果是原点位置从0水平移动300
    // kf2配合kf3,效果是从(300,0)位置垂直移动100
    KeyValue keyValue1 = new KeyValue(button.translateXProperty(), 0);// 要改变的监视属性,改变后的属性值  
    KeyValue keyValue1y = new KeyValue(button.translateYProperty(), 0);  
    KeyFrame kf1 = new KeyFrame(Duration.seconds(0), "kf1", new EventHandler<ActionEvent>() {  
        @Override  
        public void handle(ActionEvent event) {  
            System.out.println("kf1");  
        }  
    }, keyValue1, keyValue1y);// 动画开始时间、动画名称、动画完成回调函数、动画改变的监视属性  
    KeyValue keyValue2 = new KeyValue(button.translateXProperty(), 300, Interpolator.EASE_BOTH);// 要改变的监视属性,改变后的属性值,缓慢进入与离开  
    KeyValue keyValue2y = new KeyValue(button.translateYProperty(), 0);// 要改变的监视属性,改变后的属性值  
    KeyFrame kf2 = new KeyFrame(Duration.seconds(5), "kf2", new EventHandler<ActionEvent>() {  
        @Override  
        public void handle(ActionEvent event) {  
            System.out.println("kf2");  
        }  
    }, keyValue2, keyValue2y);  
    KeyValue keyValue3 = new KeyValue(button.translateYProperty(), 100);// 要改变的监视属性,改变后的属性值  
    KeyFrame ke3 = new KeyFrame(Duration.seconds(8), "ke3", new EventHandler<ActionEvent>() {  
        @Override  
        public void handle(ActionEvent event) {  
            System.out.println("kf4");  
        }  
    }, keyValue3);
    
  • 添加时间点timeline.getKeyFrames().addAll(kf1, kf2, ke3);

  • 设置动画延迟时间timeline.setDelay(Duration.seconds(1));

  • 设置动画循环次数(无限循环)timeline.setCycleCount(Timeline.INDEFINITE);

  • 设置动画循环次数(2次)timeline.setCycleCount(2);

  • 设置动画是否自动反向播放,循环次数最少为2次timeline.setAutoReverse(true);

  • 设置动画播放速率,1为正常速率,负数为倒放timeline.setRate(1);

  • 动画控制

    timeline.play();// 播放
    timeline.pause();// 暂停
    timeline.stop();// 停止
    timeline.jumpTo("kf2");// 跳转到指定的动画时间点  
    timeline.jumpTo(Duration.seconds(5));// 跳转到指定的动画时间点  
    timeline.playFromStart();// 从动画开始时间点开始播放  
    timeline.getCuePoints().put("aa",Duration.seconds(2));// 添加动画时间点  
    timeline.jumpTo("aa");  
    timeline.playFrom(Duration.seconds(5));// 从指定时间点开始播放
    
  • 动画属性

    timeline.getTargetFramerate()// 获取动画的目标帧速率
    timeline.getTotalDuration().toSeconds()// 获取动画的总时长,单位秒
    timeline.getCurrentTime().toSeconds()// 获取动画当前时间,单位秒
    
  • 动画完成回调函数

    timeline.setOnFinished(event -> {  
        System.out.println("timeline finished");  
    });
    
  • 动画状态改变监听

    timeline.statusProperty().addListener((observable, oldValue, newValue) -> {  
        System.out.println("status = " + newValue.toString());  
    });