JavaFX 平滑缩放

JavaFX smooth scaling

我正在尝试实现平滑缩放,但 setScaleX 的行为类似于 "binary" - 它立即从 1 跳(缩放)到 x。是否可以让一个节点逐渐缩放?

例如在我的 FXML 文件中我有一个节点 TableView,FXMLController 注入这个节点

@FXML TableView<TableData> tableID;

此外,我正在使用节点 "tableID" 并希望它在鼠标进入时立即缩放。所以我的想法(代码)是这样的:

public void doIncreaseTableGradually(){
    for (double i = 0.1; i < 1.5; i = i + 0.1){
    TimeUnit.MILISECONDS.sleep(100);
    doScaleTable(i);
}
}

public void doScaleTable(double i){
    tableID.setScaleX(i);
    tableID.setScaleY(i);
}

很简单。但事实证明,随着新参数的进入,setScaleX 不会缩放节点,而是采用最后一个值 (1.5) 并将其缩放 "binary"。我试图找到一个开箱即用的工具 class,比如 TranslateTransition,它可以顺利翻译,但不幸的是我找不到。

永远不要让 JavaFX 应用程序线程休眠 - 它只会在线程休眠期间冻结整个应用程序。

使用 JavaFX animation package 是在 JavaFX 中执行动画的首选方式。

动画是这样工作的:

  • JavaFX 系统发出一个脉冲(通常每秒 60 帧)。
  • 在每个脉冲上,调用动画系统中的回调,它插入一个键 属性 或调用关键帧事件处理程序来更新动画节点的属性。
  • 动画节点使用新的插值渲染。

上述过程会针对每个脉冲自动重复,直到动画完成。动画事件处理程序和插值更新自动发生,无需应用程序员干预。所以您不需要(也不应该)在您的应用程序代码中编写动画循环和线程暂停逻辑。

这里是使用内置 ScaleTransition class 执行节点动画缩放的缩放示例(该示例只是从 javadoc 复制和粘贴):

Rectangle rect = new Rectangle (100, 40, 100, 100);
rect.setArcHeight(50);
rect.setArcWidth(50);
rect.setFill(Color.VIOLET);

ScaleTransition st = new ScaleTransition(Duration.millis(2000), rect);
st.setByX(1.5f);
st.setByY(1.5f);
st.setCycleCount(4f);
st.setAutoReverse(true);

st.play();