如何使用javaFX中的KeyPress事件获得平滑的动画?

安贡

我正在尝试在JavaFX中实现矩形的左右移动。下面是我的代码:

public void start(Stage primaryStage) throws Exception {
    AnchorPane ancPane = new AnchorPane();      
    final Rectangle rect = new Rectangle();
    rect.setHeight(50);
    rect.setWidth(50);
    ancPane.getChildren().add(rect);
    Scene scene = new Scene(ancPane, 400, 200, Color.GREEN); 
    primaryStage.setScene(scene);
    primaryStage.show();


    scene.setOnKeyPressed(new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent keyEvent) {
            System.out.println("hello");

            if(keyEvent.getCode().toString() == "RIGHT"){
                System.out.println("Move Right");
                TranslateTransition translateTransitionRight = new TranslateTransition();
                translateTransitionRight.setDuration(Duration.millis(200));
                translateTransitionRight.setNode(rect);
                translateTransitionRight.setFromX(rect.getTranslateX());
                translateTransitionRight.setToX(rect.getTranslateX()+30);
                translateTransitionRight.play();
            }

            if(keyEvent.getCode().toString() == "LEFT"){
                System.out.println("Move Left");
                TranslateTransition translateTransitionRight = new TranslateTransition();
                translateTransitionRight.setDuration(Duration.millis(200));
                translateTransitionRight.setNode(rect);
                translateTransitionRight.setFromX(rect.getTranslateX());
                translateTransitionRight.setToX(rect.getTranslateX()-30);
                translateTransitionRight.play();
            }               
        }
    });

}

在这里,当我连续按任一向左/向右键(即,我没有松开键,但按住了几次)时,矩形移动但不连续。动画开始后,它会暂停一小部分时间。暂停后,动画将继续流畅。

如何摆脱使用KeyEvents进行的动画暂停?

詹姆斯·D

我将使用AnimationTimer来移动矩形,并仅更新一个表示按下键或释放键速度的属性:

final Rectangle rect = ... ;

final double rectangleSpeed = 100 ; // pixels per second
final double minX = 0 ;
final double maxX = 800 ; // whatever the max value should be.. can use a property and bind to scene width if needed...
final DoubleProperty rectangleVelocity = new SimpleDoubleProperty();
final LongProperty lastUpdateTime = new SimpleLongProperty();
final AnimationTimer rectangleAnimation = new AnimationTimer() {
  @Override
  public void handle(long timestamp) {
    if (lastUpdateTime.get() > 0) {
      final double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
      final double deltaX = elapsedSeconds * rectangleVelocity.get();
      final double oldX = rect.getTranslateX();
      final double newX = Math.max(minX, Math.min(maxX, oldX + deltaX));
      rect.setTranslateX(newX);
    }
    lastUpdateTime.set(timestamp);
  }
};
rectangleAnimation.start();

scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
  @Override
  public void handle(KeyEvent event) {
    if (event.getCode()==KeyCode.RIGHT) { // don't use toString here!!!
      rectangleVelocity.set(rectangleSpeed);
    } else if (event.getCode() == KeyCode.LEFT) {
      rectangleVelocity.set(-rectangleSpeed);
    }
  }
});

scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
  @Override
  public void handle(KeyEvent event) {
    if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT) {
      rectangleVelocity.set(0);
    }
  }
});

更新:

每当JavaFX机制渲染一帧时AnimationTimer就会执行其handle方法。传递给handle方法的long是渲染帧的时间戳,以纳秒为单位。

这种工作方式是我们跟踪上次更新时间。handle(...)方法计算自上次更新以来经过的时间,将其乘以矩形的速度,然后以该数量更新矩形的translateX。AnimationTimer始终在运行,但是最初速度设置为零,因此矩形不会移动。

keyPressed处理程序仅将速度更改为:如果向右移动,则为正值,而向左移动为负值。keyReleased处理程序将速度设置回零。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JavaFX平滑动画

来自分类Dev

在折线图D3中获得平滑的动画

来自分类Dev

如何使用animate()平滑动画?

来自分类Dev

如何在LyX中获得平滑字体?

来自分类Dev

如何使CSS动画平滑?

来自分类Dev

在为TCircle的宽度设置动画时如何获得平滑的子像素动画?

来自分类Dev

在为TCircle的宽度设置动画时如何获得平滑的子像素动画?

来自分类Dev

如何使用CSS在Javafx中为文本设置动画?

来自分类Dev

如何使用ajax处理asp.net中的TextBox.KeyPress事件

来自分类Dev

如何使用ember.js捕获列表中某个项目上的keyPress事件?

来自分类Dev

获得画布游戏的平滑动画

来自分类Dev

如何在Javascript中横向平滑地制作动画?

来自分类Dev

如何在Android中使用平滑的动画翻译视图

来自分类Dev

如何在Android中使用平滑的动画翻译视图

来自分类Dev

在Ember 2中,将on = keypress事件绑定到{{input}}时,我无法获得事件对象

来自分类Dev

我想使用CAPropertyAnimations在iOS中绘制平滑动画

来自分类Dev

Gif 动画在 KeyPress 事件上停止

来自分类Dev

UIView动画,如何使其平滑?

来自分类Dev

如何使我的python动画平滑?

来自分类Dev

如何使用像素着色器获得平滑的文本?

来自分类Dev

使用UIImageView动画创建平滑的动画

来自分类Dev

如何在jQuery的keypress事件中获取全部价值?

来自分类Dev

如何在JavaFX中创建动画的LineChart?

来自分类Dev

如何在onCahnge事件中获得价值?

来自分类Dev

如何在JavaFX中获得小的ProgressBar

来自分类Dev

如何使用QtWebEngine获得绘画事件?

来自分类Dev

如何使用UIKit在单个div中获得2个或更多个动画?

来自分类Dev

如何实现平滑的展开/折叠动画

来自分类Dev

如何为菜单创建平滑的动画?

Related 相关文章

  1. 1

    JavaFX平滑动画

  2. 2

    在折线图D3中获得平滑的动画

  3. 3

    如何使用animate()平滑动画?

  4. 4

    如何在LyX中获得平滑字体?

  5. 5

    如何使CSS动画平滑?

  6. 6

    在为TCircle的宽度设置动画时如何获得平滑的子像素动画?

  7. 7

    在为TCircle的宽度设置动画时如何获得平滑的子像素动画?

  8. 8

    如何使用CSS在Javafx中为文本设置动画?

  9. 9

    如何使用ajax处理asp.net中的TextBox.KeyPress事件

  10. 10

    如何使用ember.js捕获列表中某个项目上的keyPress事件?

  11. 11

    获得画布游戏的平滑动画

  12. 12

    如何在Javascript中横向平滑地制作动画?

  13. 13

    如何在Android中使用平滑的动画翻译视图

  14. 14

    如何在Android中使用平滑的动画翻译视图

  15. 15

    在Ember 2中,将on = keypress事件绑定到{{input}}时,我无法获得事件对象

  16. 16

    我想使用CAPropertyAnimations在iOS中绘制平滑动画

  17. 17

    Gif 动画在 KeyPress 事件上停止

  18. 18

    UIView动画,如何使其平滑?

  19. 19

    如何使我的python动画平滑?

  20. 20

    如何使用像素着色器获得平滑的文本?

  21. 21

    使用UIImageView动画创建平滑的动画

  22. 22

    如何在jQuery的keypress事件中获取全部价值?

  23. 23

    如何在JavaFX中创建动画的LineChart?

  24. 24

    如何在onCahnge事件中获得价值?

  25. 25

    如何在JavaFX中获得小的ProgressBar

  26. 26

    如何使用QtWebEngine获得绘画事件?

  27. 27

    如何使用UIKit在单个div中获得2个或更多个动画?

  28. 28

    如何实现平滑的展开/折叠动画

  29. 29

    如何为菜单创建平滑的动画?

热门标签

归档