JavaFX平滑扩展

时间:2015-01-26 17:35:34

标签: javafx

我正在尝试实现平滑缩放,但setScaleX的行为类似于"二进制" - 它立即从1跳到(刻度)到x。是否有可能逐渐缩放节点?

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

@FXML TableView<TableData> tableID;

此外,我正在使用node&#34; tableID&#34;并希望它在鼠标进入后立即扩展。所以我的想法(代码)看起来像这样:

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)并对其进行缩放&#34;二进制&#34;。我试图找到一个开箱即用的类,如TranslateTransition,它可以顺利翻译但不幸的是我无法进行。

1 个答案:

答案 0 :(得分:1)

永远不要睡眠JavaFX应用程序线程 - 它会在线程处于睡眠状态时冻结整个应用程序。

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

动画以这种方式工作:

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

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

以下是使用内置ScaleTransition类进行缩放以执行节点的动画缩放的示例(该示例只是来自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();