我正在制作一个简单的动画,我尝试在屏幕周围移动一个矩形并将其转换为圆形。
虽然形状发生变化,但矩形不会平移。我已经仔细检查了动画的KeyFrame
和KeyValues
,但我似乎无法弄明白。
SSCCE :
package anim;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.animation.TimelineBuilder;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.effect.Reflection;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.StackPaneBuilder;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.RectangleBuilder;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Duration;
public class AroundTheScreen extends Application{
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int screenWidth = gd.getDisplayMode().getWidth();
int screenHeight = gd.getDisplayMode().getHeight();
int rectWidth = screenWidth / 6;
int rectHeight = screenHeight / 6;
Rectangle rectangle;
Timeline animation;
Scene theScene;
KeyFrame topRight;
KeyFrame botRight;
KeyFrame botLeft;
KeyFrame topLeft;
StackPane pane;
DoubleProperty movableX = new SimpleDoubleProperty(0.0);
DoubleProperty movableY = new SimpleDoubleProperty(0.0);
DoubleProperty arcHt = new SimpleDoubleProperty(0.0);
DoubleProperty arcWd = new SimpleDoubleProperty(0.0);
@Override
public void start(Stage stage) throws Exception {
pane = StackPaneBuilder
.create()
.alignment(Pos.TOP_LEFT)
.build();
theScene = SceneBuilder
.create()
.width(screenWidth)
.height(screenHeight)
.root(pane)
.build();
rectangle = RectangleBuilder
.create()
.width(rectWidth)
.height(rectHeight)
.fill(Color.rgb(128, 128, 128, 0.5))
.effect(new Reflection())
.build();
rectangle.xProperty().bind(movableX);
rectangle.yProperty().bind(movableY);
rectangle.arcWidthProperty().bind(arcWd);
rectangle.arcHeightProperty().bind(arcHt);
topRight = new KeyFrame(new Duration(2000),
new KeyValue(arcWd,rectangle.getWidth()),
new KeyValue(arcHt,rectangle.getHeight()),
new KeyValue(movableX,screenWidth));
botRight = new KeyFrame(new Duration(4000),
new KeyValue(arcWd,rectangle.getWidth()),
new KeyValue(arcHt,rectangle.getHeight()),
new KeyValue(movableY,screenHeight));
botLeft = new KeyFrame(new Duration(6000),
new KeyValue(arcWd,rectangle.getWidth()),
new KeyValue(arcHt,rectangle.getHeight()),
new KeyValue(movableX,screenWidth));
topLeft = new KeyFrame(new Duration(8000),
new KeyValue(arcWd,0),
new KeyValue(arcHt,0),
new KeyValue(movableX, 0),
new KeyValue(movableY, 0));
animation = TimelineBuilder
.create()
.keyFrames(
topRight,
botRight,
botLeft,
topLeft
)
.cycleCount(Timeline.INDEFINITE)
.autoReverse(true)
.build();
pane.getChildren().add(rectangle);
stage.setScene(theScene);
stage.sizeToScene();
stage.initStyle(StageStyle.TRANSPARENT);
theScene.setFill(Color.TRANSPARENT);
stage.show();
animation.play();
}
public static void main(String[] args) {
Application.launch("anim.AroundTheScreen");
}
}
使用Timeline
答案 0 :(得分:3)
您将矩形放入StackPane
,其中自动将所有内容重定位到窗格的中心。因此,您对xProperty
ant yProperty
的所有修改都会被忽略。
改为使用Pane
。