2012-10-23 2 views
1

В языке программирования C++ или c мы знаем, что для изменения кордината мы используем gotoxy (x, y), и мы можем использовать цикл и сон, чтобы изменить кординат и сделать анимацию. как это;javafx animation looping

for(x = 20; x < 25; x++){ 
    gotoxy(x,20); cout << "*" 
} 

но мой вопрос о том, как в программировании JAVAFX 2.0? Я использую netbeans 7.2. спасибо за вашу помощь.

+1

У Google есть ответ, посмотрите класс временной шкалы http://docs.oracle.com/javafx/2/animations/basics.htm#CJAFADFJ –

ответ

2

Посмотрите на использование Timeline Animation. Это ключевой компонент анимации в JavaFX, а
используется для установления того, когда и в какой последовательности происходят ключевые части анимации.

Вот example

+1

Вопрос был о JavaFX, а материал Swing работает в отдельном потоке и JavaFX. Поэтому, если вам действительно не нужно смешивать Swing и JavaFX, не делайте этого. – user1338062

2

Используйте JavaFX Animation Package.

Существует множество примеров в JavaFX Animation Tutorial, как указал Энди в своем комментарии.

И есть симпатичный пример running horse animation loop.

Ключ в том, что вы не спятите поток приложений JavaFX, и вам нужно освободить управление потоком JavaFX обратно в систему JavaFX каждый раз, когда вы что-то обновляете и хотите, чтобы он отображался. Анимационные классы JavaFX заботятся об этих вещах для вас, поэтому вам не нужно беспокоиться об этом. Если вы просто выполняете цикл, как в примере кода, из вашего вопроса, JavaFX будет просто отображать сцену после завершения цикла и никогда не увидит, что что-то произойдет.

Вот довольно скучный пример, в котором используется Timeline, чтобы эмулировать код C++ в вашем вопросе, чтобы переместить точку на пиксель каждые 400 миллисекунд.

import java.util.Date; 
import javafx.animation.*; 
import javafx.application.Application; 
import javafx.event.*; 
import javafx.scene.*; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

/** Simple JavaFX Animation Sample. */ 
public class AnimationSample extends Application { 
    private  int   x  = 20; 
    private  String  status = ""; 
    private final Circle  dot  = new Circle(20, 20, 3); 
    private final TimeCounter counter = new TimeCounter(); 

    public static void main(String[] args) throws Exception { launch(args); } 
    @Override public void start(final Stage stage) throws Exception { 
    final Timeline timeline = new Timeline(
     new KeyFrame(Duration.ZERO, new EventHandler() { 
     @Override public void handle(Event event) { 
      refreshScene(); 
     } 
     }), 
     new KeyFrame(Duration.millis(400)) 
    ); 
    timeline.setCycleCount(Timeline.INDEFINITE); 

    stage.setScene(new Scene(new Group(dot), 50, 50)); 
    stage.show(); 

    counter.reset(); 
    timeline.play(); 
    } 

    private void refreshScene() { 
    gotoxy(x, 20); 

    status = "*****".equals(status) ? "*" : status + "*"; 
    System.out.println(String.format("%7d", counter.elapsed()) + " ms " + x + " " + status); 

    if (x == 24) { 
     x = 20; 
    } else { 
     x++; 
    } 
    }  

    private void gotoxy(int x, int y) { 
    dot.setCenterX(x); 
    dot.setCenterY(y); 
    } 

    class TimeCounter { 
    private long start = new Date().getTime(); 
    void reset() { start = new Date().getTime(); } 
    long elapsed() { return new Date().getTime() - start; } 
    } 
} 
2

В JavaFX есть три разных варианта, в зависимости от ваших потребностей.

Самый простой из AnimationTimer. Это эквивалентно таймеру Swing's Timer. Он просто содержит метод дескриптора, который вызывается для каждого фрейма и передает текущее время в качестве аргумента. Вероятно, вам нужна внутренняя бухгалтерская отчетность, чтобы вы не делали дорогостоящих вычислений каждый раз, когда вызывается дескриптор.

Transition имеет интерполяционный (frac) метод, который вызывается со значениями frac между 0.0 и 1.0. Это зависит от вас, чтобы сделать все изменения пользовательского интерфейса, которые вы хотите, на основе значения ГРП. Как переход, так и временная шкала расширяют анимацию, поэтому вы можете задавать такие вещи, как продолжительность цикла, меняется ли переход на конец и т. Д.

Timeline является самым сложным. Вы определяете произвольное количество ключевых фреймов (думайте о состояниях), которые содержат требуемые свойства разных узлов, а временная шкала будет выполнять всю работу для вас, чтобы интерполировать, как оживить изменение между предоставленными значениями. Например, вы можете указать ключевой кадр, где свойство x узла - 0, а другое - 100, а Timeline сделает анимацию для вас.