矩形不会在JavaFX 2中转换

时间:2013-10-19 16:04:59

标签: java javafx-2 translate-animation

我正在制作一个简单的动画,我尝试在屏幕周围移动一个矩形并将其转换为圆形。

虽然形状发生变化,但矩形不会平移。我已经仔细检查了动画的KeyFrameKeyValues,但我似乎无法弄明白。

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

帮助我制作动画

1 个答案:

答案 0 :(得分:3)

您将矩形放入StackPane,其中自动将所有内容重定位到窗格的中心。因此,您对xProperty ant yProperty的所有修改都会被忽略。

改为使用Pane