我正在尝试实现平滑缩放,但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,它可以顺利翻译但不幸的是我无法进行。
答案 0 :(得分:1)
永远不要睡眠JavaFX应用程序线程 - 它会在线程处于睡眠状态时冻结整个应用程序。
使用JavaFX animation package是在JavaFX中执行动画的首选方法。
动画以这种方式工作:
上述过程会自动为每个脉冲重复,直到动画完成。动画事件处理程序和插值更新自动发生,无需应用程序员干预。因此,您不需要(也不应该)在应用程序代码中编写动画循环和线程暂停逻辑。
以下是使用内置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();