2015-03-12 5 views
0

Я пытаюсь затухать один объект за раз в javafx. Я попытался использовать цикл for для циклического перехода через узлы группы, но все узлы в группе кажутся отображаемыми одновременно, а не затухающими в один момент времени. я просто не могу понять, где проблема., применяя переход к одному узлу во времени в группе в javafx

Group points = new Group(); 

     for(int i = 0; i < ipSize; i++){ 
      double xCentre = ipXPoints[i]-5; 
      double yCentre = ipYPoints[i]-5; 

      Circle point = new Circle(xCentre , yCentre, 10, Color.FORESTGREEN); 
      points.getChildren().add(point); 
     } 
pane.getChildren().add(points); 

Timeline timeline = new Timeline(); 
     for(Node node: pane.getChildren()){ 
      timeline.getKeyFrames().addAll(
        new KeyFrame(Duration.seconds(0), // set start position at 0 
         new KeyValue(node.opacityProperty(), 0, Interpolator.EASE_BOTH) 
        ), 
        new KeyFrame(Duration.seconds(3), 
         new KeyValue(node.opacityProperty(), 1, Interpolator.EASE_BOTH) 
        ) 
       ); 
timeline.play(); 
} 

EDIT: Я также попытался это, но он продолжает играть все узлы одновременно, а не по одному.

FadeTransition fade = new FadeTransition(Duration.seconds(3), node); 
      fade.setFromValue(0); 
      fade.setToValue(1); 
      fade.setAutoReverse(false); 
      fade.setCycleCount(1); 
      fade.setInterpolator(Interpolator.EASE_BOTH); 
      fade.play(); 

Спасибо за вашу помощь :)

ответ

1

Причина, почему вы получите все круги, показывая в то же время, что KeyFrame продолжительность фактически не длительность кадра, но абсолютная продолжительность от начала анимации. Таким образом, вы указываете, что все ваши переходы происходят между 0 и 3. Чтобы исправить ваш код, вам необходимо установить первую пару длительностей KeyFrame в 0 и 3, вторую пару - 3 с и 6 с, третью пару - 6 с и 9 с и т. Д.

В качестве альтернативы вы можете использовать SequentialTransition от FadeTransitions:

import java.util.Random; 

import javafx.animation.FadeTransition; 
import javafx.animation.SequentialTransition; 
import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 
import javafx.util.Duration; 


public class SequentialFadeIn extends Application { 

    @Override 
    public void start(Stage stage) { 
     int width = 600; 
     int height = 400; 

     Group points = new Group(); 
     SequentialTransition seq = new SequentialTransition(); 
     Random random = new Random(); 
     for(int i = 0; i < 10; i++){ 
      double xCentre = random.nextInt(width); 
      double yCentre = random.nextInt(height); 

      Circle point = new Circle(xCentre , yCentre, 10, Color.FORESTGREEN); 
      point.setOpacity(0.0); 

      points.getChildren().add(point); 
      FadeTransition fade = new FadeTransition(Duration.seconds(3), point); 
      fade.setToValue(1.0); 
      seq.getChildren().add(fade); 
     } 

     stage.setScene(new Scene(points, width, height)); 
     stage.show(); 
     seq.play(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Это то, что я пытался достичь все время. Бесконечно благодарен – Lycon