我正在使用JavaFX RotateTransition进行一些试验,应用在jfx本身文档文件中找到的简单模型:
rotateTransition = RotateTransitionBuilder.create()
.node(elements)
.duration(Duration.seconds(4))
.fromAngle(0)
.toAngle(720)
.cycleCount(3)
.autoReverse(true)
.build();
在上方,elements
是Group
裸Arc
个原语。
当此组具有有限数量的节点(例如20)时,动画变得平滑但是当我将节点数增加到500(实际嵌套,组的组)时,动画仍然有效,但不会产生任何流动性。
问题是:对于此任务,此节点限制是否可以被认为太多?如何加快渲染速度?
我发现下面的线程在类似的上下文断言可能是使用正确的动画类的问题,但我不确定提议的AnimationTimer
是否适用于旋转。
http://mail.openjdk.java.net/pipermail/openjfx-dev/2013-June/008104.html
我还尝试将setCache(true)
用于每个节点,但没有明显的改进。
谢谢!
编辑:弧生成。除了活页夹和EventHandler之外没什么奇怪的东西。
Arc arc = new Arc();
arc.centerXProperty().bind(plotRadiusBinding);
arc.centerYProperty().bind(plotRadiusBinding);
arc.radiusXProperty().bind(plotRadiusBinding);
arc.radiusYProperty().bind(plotRadiusBinding);
arc.setStartAngle(startAngle * 180 / PI);
arc.setLength(radiansLength * 180 / PI);
arc.setType(ArcType.ROUND);
arc.setStroke(defaultArcColor);
arc.setStrokeType(StrokeType.INSIDE);
arc.setFill(null);
arc.setOnMouseClicked(arcEventHandler);
答案 0 :(得分:0)
当我使用KeyFrames(KeyFrames)时移动图像时出现类似问题 我可以通过使用
来改进它我自己实施这些东西取得了成功:
Animation animation = new Transition() {
{
setCycleDuration(Duration.millis(1000));
}
@Override
protected void interpolate(double frac) {
// your rotation code here
}
}
如果您可以提供电弧生成源代码,那么它可能会有所帮助。
答案 1 :(得分:0)
对我来说,这可以完美地工作500弧:
package application;
import java.util.Random;
import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Arc;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
Pane root = new Pane();
Group group = new Group();
Random rand = new Random();
for(int i=0; i<1000; i++){
Arc c = new Arc(200 + rand.nextInt(400), 200 + rand.nextInt(400), 10, 10, 0, 360);
group.getChildren().add(c);
}
root.getChildren().add(group);
RotateTransition rotateTransition = new RotateTransition(Duration.millis(5000), group);
rotateTransition.setFromAngle(0);
rotateTransition.setToAngle(720);
rotateTransition.setCycleCount(3);
rotateTransition.setAutoReverse(true);
rotateTransition.play();
Scene scene = new Scene(root,800,800);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
如果这仍然是滞后的,你只想绘制弧线,你可以直接调用画布的图形上下文。