2014-01-28 2 views
9

Я хотел бы узнать, можно ли использовать GraphicsContext Canvas для создания круга (или любой фигуры, созданной с помощью GraphicsContext), а затем перемещать его по холсту. Если это так, каков алгоритм для этого? Я привык работать с Java, и я просто не могу понять это.Перемещение фигур в холсте JavaFX

Заранее благодарим за любую помощь.

+1

Hi. Добро пожаловать в переполнение стека. Что вы делали до сих пор? - если вы показываете какой-то код, вы, скорее всего, получите положительный ответ. – iandotkelly

ответ

25

В основном, как это работает, вы устанавливаете Canvas и обновляете местоположение фигуры на основе некоторого Timeline. Затем, в AnimationTimer, вы рисуете свой холст.

circlefun

import javafx.animation.*; 
import javafx.application.Application; 
import javafx.beans.property.*; 
import javafx.scene.*; 
import javafx.scene.canvas.*; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class AnimatedCircleOnCanvas extends Application { 
    public static final double W = 200; // canvas dimensions. 
    public static final double H = 200; 

    public static final double D = 20; // diameter. 

    @Override public void start(Stage stage) { 
     DoubleProperty x = new SimpleDoubleProperty(); 
     DoubleProperty y = new SimpleDoubleProperty(); 

     Timeline timeline = new Timeline(
      new KeyFrame(Duration.seconds(0), 
        new KeyValue(x, 0), 
        new KeyValue(y, 0) 
      ), 
      new KeyFrame(Duration.seconds(3), 
        new KeyValue(x, W - D), 
        new KeyValue(y, H - D) 
      ) 
     ); 
     timeline.setAutoReverse(true); 
     timeline.setCycleCount(Timeline.INDEFINITE); 

     final Canvas canvas = new Canvas(W, H); 
     AnimationTimer timer = new AnimationTimer() { 
      @Override 
      public void handle(long now) { 
       GraphicsContext gc = canvas.getGraphicsContext2D(); 
       gc.setFill(Color.CORNSILK); 
       gc.fillRect(0, 0, W, H); 
       gc.setFill(Color.FORESTGREEN); 
       gc.fillOval(
        x.doubleValue(), 
        y.doubleValue(), 
        D, 
        D 
       ); 
      } 
     }; 

     stage.setScene(
      new Scene(
       new Group(
        canvas 
       ) 
      ) 
     ); 
     stage.show(); 

     timer.start(); 
     timeline.play(); 
    } 

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

Это, однако, проще не использовать холст, но вместо того, чтобы использовать Pane, содержащий Circle в сочетании с TranslateTransition.

+2

Вы легенда! Большое вам спасибо, я потратил много часов на поиски и не нашел ничего. Вы также правы в том, что решение Pane and Circle было проще, идея заключалась в том, чтобы сделать это на Java, и тогда я подумал, что это будет почти то же самое, что использовать JavaFX (ни одна из моих самых умных мыслей) Еще раз спасибо! – fatherjim91

+0

Я анимировал узлы фигуры на панели, которая сама была внутри панели, но я не мог понять, как работает система координат относительно родительских панелей. Теперь я пытаюсь рисовать фигуры на Canvas для анимации. Поскольку мне нужно много форм, казалось бы, Canvas лучше подходит для производительности. – burntsugar

+1

@burntsuger, это несколько не связано с исходным вопросом, но вас может заинтересовать [производительность JavaFX] (http://stackoverflow.com/questions/10506637/javafx-2-drawing-performance) и некоторые [советы и рекомендации ] (https://wiki.openjdk.java.net/display/OpenJFX/Performance+Tips+and+Tricks). Oracle [benchmarked производительность JavaFX] (https://oracleus.activeevents.com/2013/connect/fileDownload/session/C3B800733D28DB105AB5FC964843D1AB/CON1905_Heidrich.pptx), а холст может быть медленнее, чем узлы (страницы 41-52). Производительность с каждым зависит от приложения, поэтому вам может понадобиться сравнить ваше приложение с обоими. – jewelsea

Смежные вопросы