2013-10-19 96 views
2

我正在製作一個簡單的動畫,我試圖在屏幕周圍移動一個矩形並將其轉換爲圓形。矩形不會在JavaFX中轉換2

雖然形狀發生變化,但矩形不會轉換。我已經仔細檢查了動畫的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

回答

3

你把矩形動畫成StackPane其中自動搬遷全部內容窗格的中心。因此,所有對xProperty ant yProperty的修改都將被忽略。使用Pane代替。