JavaFX示例--TimeLine和Animation的使用

来源:互联网 发布:52单片机引脚图电路图 编辑:程序博客网 时间:2024/05/29 13:23

这两天工作很忙,由于要进行Android平板上的一个项目的final release,前天晚上加班到11点多,昨天晚上加班到凌晨4点多。所以之前说的Sourceforge的首页也才做了一部分。不过,由于项目final release,今天比较轻松,写了几个JavaFX的示例。


  

  

  上面就是一个简单的示例。

  

  示例的演示地址:http://wjfxgame.sourceforge.net/examples/exp1/AniTest.html


   点击Start开始动画。


 主要是应用了JavaFX中的Timeline和Animation。

  Timeline在之前的博文中,很多地方用到了。也就是一个时间轴,然后通过添加关键帧来形成动画。


  而Animation,主要是对Node进行动画处理。JavaFX中的动画在javafx.animation包中。而Animation有两个子类,Timeline和Transition。也就是说,按照API中的层级关系来看,Timeline是Animation的一种。


  当然,我们也就不必纠结标题中的Timeline和Animation了。


  Transition共有10个子类,分别是:FadeTransition, FillTransition, ParallelTransition, PathTransition, PauseTransition, RotateTransition, ScaleTransition, SequentialTransition, StrokeTransition, TranslateTransition。


  其实子类虽多,但动画的基本效果都可以根据命名前缀来判断。基本都是Node属性的改变,像边框色,填充色,透明度,缩放,旋转,平移,按路径移动和暂停。


  只有ParallelTransition是并行动画(一系列动画同时进行),SequentialTransition是顺序动画(一系列动画按顺序执行)。


  下面看一下源代码:

  

[java] view plaincopy
  1. import javafx.animation.*;  
  2. import javafx.event.ActionEvent;  
  3. import javafx.event.EventHandler;  
  4. import javafx.scene.control.ToggleButton;  
  5. import javafx.scene.control.ToggleGroup;  
  6. import javafx.scene.effect.Bloom;  
  7. import javafx.scene.layout.HBox;  
  8. import javafx.scene.layout.Pane;  
  9. import javafx.scene.paint.Color;  
  10. import javafx.scene.shape.*;  
  11. import javafx.util.Duration;  
  12.   
  13. /** 
  14.  * 
  15.  * @author wing 
  16.  */  
  17. public class TestPane extends Pane{  
  18.     private ParallelTransition mAnimList;  
  19.       
  20.     private Timeline timeline;  
  21.       
  22.     private HBox hBox;  
  23.     private ToggleButton start, pause, stop;  
  24.     private ToggleGroup btnGroup;  
  25.       
  26.     private double duration = 200;  
  27.     public TestPane(){  
  28.         btnGroup = new ToggleGroup();  
  29.         start = new ToggleButton("Start");  
  30.         start.setToggleGroup(btnGroup);  
  31.         start.setOnAction(new EventHandler<ActionEvent>() {  
  32.   
  33.             @Override  
  34.             public void handle(ActionEvent arg0) {  
  35.                 timeline.play();  
  36.                 checkUIState();  
  37.             }  
  38.         });  
  39.           
  40.         pause = new ToggleButton("Pause");  
  41.         pause.setToggleGroup(btnGroup);  
  42.         pause.setOnAction(new EventHandler<ActionEvent>() {  
  43.   
  44.             @Override  
  45.             public void handle(ActionEvent arg0) {  
  46.                 timeline.pause();  
  47.                 checkUIState();  
  48.             }  
  49.         });         
  50.    
  51.         stop = new ToggleButton("Stop");  
  52.         stop.setToggleGroup(btnGroup);  
  53.         stop.setOnAction(new EventHandler<ActionEvent>() {  
  54.   
  55.             @Override  
  56.             public void handle(ActionEvent arg0) {  
  57.                 timeline.stop();  
  58.                 checkUIState();  
  59.             }  
  60.         });     
  61.           
  62.         hBox = new HBox(10);  
  63.         hBox.getChildren().addAll(start, pause, stop);  
  64.           
  65.         hBox.setTranslateX((Anitest.WIDTH - 200) / 2);  
  66.         hBox.setTranslateY(20);  
  67.           
  68.         getChildren().add(hBox);  
  69.           
  70.           
  71.         timeline = new Timeline();  
  72.           
  73.         timeline.setCycleCount(Timeline.INDEFINITE);  
  74.         KeyFrame keyFrame = new KeyFrame(Duration.millis(duration), new EventHandler<ActionEvent>() {  
  75.   
  76.             @Override  
  77.             public void handle(ActionEvent event) {  
  78.                 createObject();  
  79.             }  
  80.         });  
  81.         timeline.getKeyFrames().add(keyFrame);  
  82.     }  
  83.       
  84.     /** 
  85.      * 检测start pause stop三个按钮的状态 
  86.      */  
  87.     public void checkUIState(){  
  88.         start.setDisable(false);  
  89.         pause.setDisable(false);  
  90.         stop.setDisable(false);  
  91.         switch(timeline.getStatus()){  
  92.             case RUNNING:  
  93.                 start.setDisable(true);  
  94.                 break;  
  95.             case PAUSED:  
  96.                 pause.setDisable(true);  
  97.                 break;  
  98.             case STOPPED:  
  99.                 stop.setDisable(true);  
  100.                 break;  
  101.         }  
  102.     }  
  103.       
  104.       
  105.     /** 
  106.      * 创建一个Object 并执行动画,在这里创建了一个ParallelTransition,并在其中添加了随机左右上下平移的TranslateTransition,透明度逐渐变为0的FadeTransition和逐渐放大0.2倍的ScaleTransition。将刚创建的Object与组合这个三个动画的ParallelTransition绑定,然后执行ParallelTransition。 
  107.      */  
  108.     public void createObject() {  
  109.         double width = Math.max(50, Math.random() * 200);  
  110.         double height = Math.max(50, Math.random() * 200);          
  111.         double x = Math.min(Math.random() * Anitest.WIDTH, Anitest.WIDTH - width);  
  112.         double y = Math.max(Math.random() * (Anitest.HEIGHT - 100), 100);  
  113.           
  114.         double dx = Math.random() * 50;  
  115.         double dy = Math.random() * 50;  
  116.         final Shape shape = new Circle(x, y, width / 2);  
  117.         shape.setEffect(new Bloom(50));  
  118.         shape.setFill(Color.rgb((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255)));  
  119.         getChildren().add(shape);  
  120.         mAnimList = new ParallelTransition(  
  121.                 shape,  
  122.                 TranslateTransitionBuilder.create().byX(Math.random() > 0.5 ? dx : -dx).byY(Math.random() > 0.5 ? dy : -dy).duration(Duration.millis(1000)).build(),  
  123.                 FadeTransitionBuilder.create().toValue(0).duration(Duration.millis(1000)).build(),  
  124.                 ScaleTransitionBuilder.create().byX(0.2).byY(0.2).duration(Duration.millis(800)).build());  
  125.         mAnimList.play();  
  126.         mAnimList.setOnFinished(new EventHandler<ActionEvent>() {  
  127.   
  128.             @Override  
  129.             public void handle(ActionEvent arg0) {  
  130.                 getChildren().remove(shape);  
  131.             }  
  132.         });  
  133.     }  
  134. }  


  并在动画结束的时候,将刚创建的Object进行移除操作。


  这里的Transition都是用各自的Builder来创建。


  至于为何这里会继承Pane,主要是这些示例我之后都会加进Sourceforge首页的站点中,在那个App里会使用到。


  下面是Main类:

  

[java] view plaincopy
  1. import javafx.application.Application;  
  2. import javafx.scene.Scene;  
  3. import javafx.scene.layout.StackPane;  
  4. import javafx.scene.paint.Color;  
  5. import javafx.stage.Stage;  
  6.   
  7. /** 
  8.  * @author wing 
  9.  * 2012/8/30 
  10.  */  
  11. public class Anitest extends Application {  
  12.     public static final int WIDTH = 800;  
  13.     public static final int HEIGHT = 600;  
  14.     public static void main(String[] args) {  
  15.         launch(args);  
  16.     }  
  17.       
  18.     @Override  
  19.     public void start(Stage primaryStage) {  
  20.         TestPane mPane = new TestPane();  
  21.         StackPane root = new StackPane();  
  22.         root.getChildren().add(mPane);  
  23.         Scene scene = new Scene(root, WIDTH, HEIGHT);  
  24.         scene.setFill(Color.BLACK);  
  25.         primaryStage.setScene(scene);  
  26.         primaryStage.setTitle("JavaFX示例--TimeLine和Animation的使用");  
  27.         primaryStage.show();  
  28.     }  
  29. }  

  Main类就不做解释了,都是很基本的内容。


    转载请注明出处:http://blog.csdn.net/ml3947/

---------------------------------------------------------

  本来是尝试在博文中嵌入Applet,尝试了半天没成功,但是又看到以前一直关注的一位牛人博客里嵌入过。顿感奇怪中。准备以后再看看。


  所以就直接给了演示的地址。如果系统没安装JavaFX的时候,应该会提示你安装新版Java去。因为JRE7中已经包含了JavaFX了。

  

0 0