`

JavaFX示例--TimeLine和Animation的使用

 
阅读更多

这两天工作很忙,由于要进行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是顺序动画(一系列动画按顺序执行)。


下面看一下源代码:

import javafx.animation.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.effect.Bloom;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.util.Duration;

/**
 *
 * @author wing
 */
public class TestPane extends Pane{
    private ParallelTransition mAnimList;
    
    private Timeline timeline;
    
    private HBox hBox;
    private ToggleButton start, pause, stop;
    private ToggleGroup btnGroup;
    
    private double duration = 200;
    public TestPane(){
        btnGroup = new ToggleGroup();
        start = new ToggleButton("Start");
        start.setToggleGroup(btnGroup);
        start.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                timeline.play();
                checkUIState();
            }
        });
        
        pause = new ToggleButton("Pause");
        pause.setToggleGroup(btnGroup);
        pause.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                timeline.pause();
                checkUIState();
            }
        });       
 
        stop = new ToggleButton("Stop");
        stop.setToggleGroup(btnGroup);
        stop.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                timeline.stop();
                checkUIState();
            }
        });   
        
        hBox = new HBox(10);
        hBox.getChildren().addAll(start, pause, stop);
        
        hBox.setTranslateX((Anitest.WIDTH - 200) / 2);
        hBox.setTranslateY(20);
        
        getChildren().add(hBox);
        
        
        timeline = new Timeline();
        
        timeline.setCycleCount(Timeline.INDEFINITE);
        KeyFrame keyFrame = new KeyFrame(Duration.millis(duration), new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                createObject();
            }
        });
        timeline.getKeyFrames().add(keyFrame);
    }
    
    /**
     * 检测start pause stop三个按钮的状态
     */
    public void checkUIState(){
        start.setDisable(false);
        pause.setDisable(false);
        stop.setDisable(false);
        switch(timeline.getStatus()){
            case RUNNING:
                start.setDisable(true);
                break;
            case PAUSED:
                pause.setDisable(true);
                break;
            case STOPPED:
                stop.setDisable(true);
                break;
        }
    }
    
    
    /**
     * 创建一个Object 并执行动画,在这里创建了一个ParallelTransition,并在其中添加了随机左右上下平移的TranslateTransition,透明度逐渐变为0的FadeTransition和逐渐放大0.2倍的ScaleTransition。将刚创建的Object与组合这个三个动画的ParallelTransition绑定,然后执行ParallelTransition。
     */
    public void createObject() {
        double width = Math.max(50, Math.random() * 200);
        double height = Math.max(50, Math.random() * 200);        
        double x = Math.min(Math.random() * Anitest.WIDTH, Anitest.WIDTH - width);
        double y = Math.max(Math.random() * (Anitest.HEIGHT - 100), 100);
        
        double dx = Math.random() * 50;
        double dy = Math.random() * 50;
        final Shape shape = new Circle(x, y, width / 2);
        shape.setEffect(new Bloom(50));
        shape.setFill(Color.rgb((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255)));
        getChildren().add(shape);
        mAnimList = new ParallelTransition(
                shape,
                TranslateTransitionBuilder.create().byX(Math.random() > 0.5 ? dx : -dx).byY(Math.random() > 0.5 ? dy : -dy).duration(Duration.millis(1000)).build(),
                FadeTransitionBuilder.create().toValue(0).duration(Duration.millis(1000)).build(),
                ScaleTransitionBuilder.create().byX(0.2).byY(0.2).duration(Duration.millis(800)).build());
        mAnimList.play();
        mAnimList.setOnFinished(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                getChildren().remove(shape);
            }
        });
    }
}


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


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


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


下面是Main类:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 * @author wing
 * 2012/8/30
 */
public class Anitest extends Application {
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        TestPane mPane = new TestPane();
        StackPane root = new StackPane();
        root.getChildren().add(mPane);
        Scene scene = new Scene(root, WIDTH, HEIGHT);
        scene.setFill(Color.BLACK);
        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX示例--TimeLine和Animation的使用");
        primaryStage.show();
    }
}

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


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

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

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


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

分享到:
评论

相关推荐

    JavaFX2.0内建控件教程(全部控件)

    import javafx.animation.Timeline; import javafx.util.Duration; import javafx.scene.control.Button; import javafx.scene.text.Font; import javafx.scene.effect.Reflection; Button button = new Button(); ...

    JavaFX播放视频(flv)例子

    对于更复杂的多媒体应用,你还可以探索JavaFX的`Timeline`和`Animation`类,以实现更丰富的交互效果。 总之,这个"JavaFX播放视频(flv)例子"是一个很好的起点,可以帮助你掌握JavaFX的基本用法,并且逐步了解如何...

    fx-guybrush:一个基本的 JavaFX 示例,涵盖节点、事件和动画

    本示例“fx-guybrush”旨在介绍 JavaFX 的基础,包括节点(Nodes)、事件处理(Event Handling)以及动画(Animation)。让我们深入探讨这些核心概念。 1. 节点(Nodes): 在 JavaFX 中,节点是构成用户界面的基本...

    openjfx-14-javadoc.zip

    `javafx.animation.Timeline`用于创建时间线动画。 2. **包结构**:JavaFX的API被组织成多个包,如`javafx.application`、`javafx.scene`、`javafx.controls`和`javafx.media`等。每个包都有其特定的用途,例如`...

    商业编程-源码-一个简单的窗体震动的例程.zip

    以下是一个简单的JavaFX示例: ```java import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout....

    CircleAnimation:绕圈旋转(JavaFX动画)

    "CircleAnimation-master"这个压缩包文件可能包含了实现上述动画的完整代码和资源。解压后,开发者可以查看和运行源代码,学习如何将JavaFX动画技术应用于自己的项目中。 总之,JavaFX的动画系统为开发者提供了丰富...

    java 关于动画的一段处理程序,很精采的-java animation on the procedures for hand

    此外,如果使用JavaFX,可能还用到了Timeline和KeyFrame来定义手部动画的各个阶段。 总之,Java提供了多种方式来创建动画,无论是简单的滑动效果还是复杂的3D动画。理解并掌握这些工具和概念对于开发动态、交互性强...

    时间轴效果

    import javafx.animation.Timeline; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.scene.shape.Circle; import javafx.util.Duration;...

    彩虹字,七彩文字带波浪效果

    使用JavaFX时,可以利用`Text`节点和`Timeline`类来控制颜色的变化。 下面是一个简单的JavaFX实现彩虹字的示例: ```java import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx....

    eclipse的动画实现

    在提供的"Animation"压缩包中,可能包含了一些示例代码,这些代码可能展示了如何在Eclipse中使用多线程和动画。具体分析取决于实际的源代码内容,但通常会包含创建线程、定义动画逻辑以及可能的用户交互部分。 总结...

    java源码:Java实现移动的遮照效果.rar

    由于标签中提到的是"源码",我们可以推测这个项目可能使用了JavaFX,因为它是Java中更现代且支持丰富的图形和动画功能的库。 在JavaFX中,我们可以使用`Region`类或者`Rectangle`类来创建遮罩,并通过调整其透明度...

    一条一条显示的跑马灯

    3. **设置定时器**:使用`javax.swing.Timer`(Swing)或`javafx.animation.Timeline`(JavaFX)创建一个定时器,周期性地执行滚动操作。 4. **滚动文本**:在定时器的回调方法中,将当前显示的文本移动到队列末尾...

    带动画效果的简单Tips显示

    例如,在JavaFX中,你可以使用`Timeline`和`KeyFrame`来创建动画效果。下面是一个简化的例子,展示了如何用JavaFX让一个Tips渐显渐隐: ```java import javafx.animation.*; import javafx.scene.Scene; import ...

    图片切换java图片切换java图片切换java

    在JavaFX中,我们可以使用ImageView和Timeline来实现类似的效果。例如: ```java import javafx.animation.*; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image....

    漂浮效果,漂浮效果的装饰物

    使用Timeline或者AnimationTimer可以定期调用这个方法。以下是一个简单的示例: ```java import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.scene.Scene; import ...

    java 时钟 代码

    在JavaFX中,对应的类是`javafx.scene.layout.StackPane`,`javafx.scene.control.Label`和`javafx.animation.Timeline`。 4. **格式化时间**: `java.time.format.DateTimeFormatter`类可以帮助我们将日期和时间...

    tweenengineapi:吐温引擎的 javadoc

    在CSS中,我们可以使用`transition`和`animation`属性创建类似的效果,而TweenEngine则提供了一种编程式的接口,可以更好地控制动画的每一个细节。 ### 5. 应用场景 吐温引擎常用于游戏开发中的角色移动、物体旋转...

    基于Java的实例源码-Jav动画图标源码(显示GIF图像).zip

    3. **AnimationTimer**: Java Swing中的`javax.swing.Timer`或JavaFX的`javafx.animation.Timeline`可以用来控制GIF的帧率,实现动画效果。定时器会在特定间隔调用一个回调方法,更新显示的图像帧。 4. **ImageIO ...

    Java编写线程动画

    在JavaFX中,我们可以使用Timeline或者Transition类来创建动画。 ```java import javafx.animation.TranslateTransition; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene...

Global site tag (gtag.js) - Google Analytics