JavaFX官方教程(十一)之动画基础

翻译自   动画基础

动画基础提供基本动画概念,包含以下部分:

  • 转变

  • 时间线动画

  • 插值

 

JavaFX中的动画可以分为时间轴动画和过渡。本章提供了每种动画类型的示例。

Timeline并且Transitionjavafx.animation.Animation该类的子类。有关特定类,方法或其他功能的更多信息,请参阅API文档。

转变

JavaFX中的转换提供了在内部时间轴中合并动画的方法。可以组合转换以创建并行或顺序执行的多个动画。有关详细信息,请参见并行转换和顺序转换部分。以下部分提供了一些过渡动画示例。

淡出过渡

淡入淡出过渡会在给定时间内更改节点的不透明度。

示例3-1显示了应用于矩形的淡入淡出过渡的代码片段。首先创建一个带圆角的矩形,然后对其应用淡入淡出过渡。

例3-1淡入淡出过渡

final Rectangle rect1 = new Rectangle(10, 10, 100, 100);
rect1.setArcHeight(20);
rect1.setArcWidth(20);
rect1.setFill(Color.RED);
...
FadeTransition ft = new FadeTransition(Duration.millis(3000), rect1);
ft.setFromValue(1.0);
ft.setToValue(0.1);
ft.setCycleCount(Timeline.INDEFINITE);
ft.setAutoReverse(true);
ft.play();

路径转换

路径转换在给定时间内沿着路径将节点从一端移动到另一端。

图3-1路径转换

示例3-2显示了应用于矩形的路径转换的代码段。当矩形到达路径的末尾时,动画将反转。在代码中,首先创建一个带圆角的矩形,然后创建一个新的路径动画并应用于该矩形。

例3-2路径转换

final Rectangle rectPath = new Rectangle (0, 0, 40, 40);
rectPath.setArcHeight(10);
rectPath.setArcWidth(10);
rectPath.setFill(Color.ORANGE);
...
Path path = new Path();
path.getElements().add(new MoveTo(20,20));
path.getElements().add(new CubicCurveTo(380, 0, 380, 120, 200, 120));
path.getElements().add(new CubicCurveTo(0, 120, 0, 240, 380, 240));
PathTransition pathTransition = new PathTransition();
pathTransition.setDuration(Duration.millis(4000));
pathTransition.setPath(path);
pathTransition.setNode(rectPath);
pathTransition.setOrientation(PathTransition.OrientationType.ORTHOGONAL_TO_TANGENT);
pathTransition.setCycleCount(Timeline.INDEFINITE);
pathTransition.setAutoReverse(true);
pathTransition.play();

并行过渡

并行转换同时执行多个转换。

示例3-3显示了用于执行应用于矩形的淡入淡出,平移,旋转和缩放过渡的并行过渡的代码片段。

图3-2并行转换


例3-3并行转换

Rectangle rectParallel = new Rectangle(10,200,50, 50);
rectParallel.setArcHeight(15);
rectParallel.setArcWidth(15);
rectParallel.setFill(Color.DARKBLUE);
rectParallel.setTranslateX(50);
rectParallel.setTranslateY(75);
...FadeTransition fadeTransition = new FadeTransition(Duration.millis(3000), rectParallel);fadeTransition.setFromValue(1.0f);fadeTransition.setToValue(0.3f);fadeTransition.setCycleCount(2);fadeTransition.setAutoReverse(true);TranslateTransition translateTransition =new TranslateTransition(Duration.millis(2000), rectParallel);translateTransition.setFromX(50);translateTransition.setToX(350);translateTransition.setCycleCount(2);translateTransition.setAutoReverse(true);RotateTransition rotateTransition = new RotateTransition(Duration.millis(3000), rectParallel);rotateTransition.setByAngle(180f);rotateTransition.setCycleCount(4);rotateTransition.setAutoReverse(true);ScaleTransition scaleTransition = new ScaleTransition(Duration.millis(2000), rectParallel);scaleTransition.setToX(2f);scaleTransition.setToY(2f);scaleTransition.setCycleCount(2);scaleTransition.setAutoReverse(true);parallelTransition = new ParallelTransition();parallelTransition.getChildren().addAll(fadeTransition,translateTransition,rotateTransition,scaleTransition);parallelTransition.setCycleCount(Timeline.INDEFINITE);parallelTransition.play();

顺序转换

顺序转换一个接一个地执行几个转换。

例3-4显示了一个接一个地执行的顺序转换的代码。淡化,平移,旋转和缩放应用于矩形的过渡。

例3-4顺序转换

Rectangle rectSeq = new Rectangle(25,25,50,50);
rectSeq.setArcHeight(15);
rectSeq.setArcWidth(15);
rectSeq.setFill(Color.CRIMSON);
rectSeq.setTranslateX(50);
rectSeq.setTranslateY(50);...FadeTransition fadeTransition = new FadeTransition(Duration.millis(1000), rectSeq);fadeTransition.setFromValue(1.0f);fadeTransition.setToValue(0.3f);fadeTransition.setCycleCount(1);fadeTransition.setAutoReverse(true);TranslateTransition translateTransition =new TranslateTransition(Duration.millis(2000), rectSeq);translateTransition.setFromX(50);translateTransition.setToX(375);translateTransition.setCycleCount(1);translateTransition.setAutoReverse(true);RotateTransition rotateTransition = new RotateTransition(Duration.millis(2000), rectSeq);rotateTransition.setByAngle(180f);rotateTransition.setCycleCount(4);rotateTransition.setAutoReverse(true);ScaleTransition scaleTransition = new ScaleTransition(Duration.millis(2000), rectSeq);scaleTransition.setFromX(1);scaleTransition.setFromY(1);scaleTransition.setToX(2);scaleTransition.setToY(2);scaleTransition.setCycleCount(1);scaleTransition.setAutoReverse(true);sequentialTransition = new SequentialTransition();
sequentialTransition.getChildren().addAll(fadeTransition,translateTransition,rotateTransition,scaleTransition);
sequentialTransition.setCycleCount(Timeline.INDEFINITE);
sequentialTransition.setAutoReverse(true);sequentialTransition.play();

有关动画和过渡的更多信息,请参阅SDK中的API文档和Ensemble项目中的“动画”部分。

时间线动画

动画由其相关属性(例如大小,位置和颜色等)驱动。Timeline提供了沿着时间进展更新属性值的功能。JavaFX支持关键帧动画。在关键帧动画中,图形场景的动画状态转换由特定时间场景状态的开始和结束快照(关键帧)声明。系统可以自动执行动画。它可以在请求时停止,暂停,恢复,反向或重复移动。

基本时间线动画

例3-5中的代码水平设置一个矩形,并将其从原始位置移动X=100X=300500毫秒。要水平设置对象动画,请更改x坐标并保持y坐标不变。

图3-3水平移动

例3-5显示了基本时间轴动画的代码片段。

例3-5时间轴动画

final Rectangle rectBasicTimeline = new Rectangle(100, 50, 100, 50);
rectBasicTimeline.setFill(Color.RED);
...
final Timeline timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
final KeyValue kv = new KeyValue(rectBasicTimeline.xProperty(), 300);
final KeyFrame kf = new KeyFrame(Duration.millis(500), kv);
timeline.getKeyFrames().add(kf);
timeline.play();

时间线活动

JavaFX提供了合并在时间线播放期间可以触发的事件的方法。示例3-6中的代码更改指定范围内圆的半径,并KeyFrame触发场​​景的x坐标中圆的随机转换。

示例3-6时间轴事件

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.animation.AnimationTimer;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.Lighting;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Text;
import javafx.util.Duration;public class TimelineEvents extends Application {//main timelineprivate Timeline timeline;private AnimationTimer timer;//variable for storing actual frameprivate Integer i=0;@Override public void start(Stage stage) {Group p = new Group();Scene scene = new Scene(p);stage.setScene(scene);stage.setWidth(500);stage.setHeight(500);p.setTranslateX(80);p.setTranslateY(80);//create a circle with effectfinal Circle circle = new Circle(20,  Color.rgb(156,216,255));circle.setEffect(new Lighting());//create a text inside a circlefinal Text text = new Text (i.toString());text.setStroke(Color.BLACK);//create a layout for circle with text insidefinal StackPane stack = new StackPane();stack.getChildren().addAll(circle, text);stack.setLayoutX(30);stack.setLayoutY(30);p.getChildren().add(stack);stage.show();//create a timeline for moving the circletimeline = new Timeline();timeline.setCycleCount(Timeline.INDEFINITE);timeline.setAutoReverse(true);//You can add a specific action when each frame is started.timer = new AnimationTimer() {@Overridepublic void handle(long l) {text.setText(i.toString());i++;}};//create a keyValue with factory: scaling the circle 2timesKeyValue keyValueX = new KeyValue(stack.scaleXProperty(), 2);KeyValue keyValueY = new KeyValue(stack.scaleYProperty(), 2);//create a keyFrame, the keyValue is reached at time 2sDuration duration = Duration.millis(2000);//one can add a specific action when the keyframe is reachedEventHandler onFinished = new EventHandler<ActionEvent>() {public void handle(ActionEvent t) {stack.setTranslateX(java.lang.Math.random()*200-100);//reset counteri = 0;}};KeyFrame keyFrame = new KeyFrame(duration, onFinished , keyValueX, keyValueY);//add the keyframe to the timelinetimeline.getKeyFrames().add(keyFrame);timeline.play();timer.start();}public static void main(String[] args) {Application.launch(args);}} 

插值

插值定义了对象在运动的起点和终点之间的位置。您可以使用Interpolator类的各种内置实现,也可以实现自己的Interpolator来实现自定义插值行为。

内置插补器

JavaFX提供了几个内置插补器,您可以使用它们在动画中创建不同的效果。默认情况下,JavaFX使用线性插值来计算坐标。

例3-7显示了一个代码片段,其中EASE_BOTH插值器实例被添加到基本时间轴动画中的KeyValue。当对象到达其起点和终点时,此插补器会创建弹簧效果。

例3-7内置插补器

final Rectangle rectBasicTimeline = new Rectangle(100, 50, 100, 50);
rectBasicTimeline.setFill(Color.BROWN);
...
final Timeline timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
final KeyValue kv = new KeyValue(rectBasicTimeline.xProperty(), 300,Interpolator.EASE_BOTH);
final KeyFrame kf = new KeyFrame(Duration.millis(500), kv);
timeline.getKeyFrames().add(kf);
timeline.play();

定制插补器

除了内置插补器,您还可以实现自己的插补器来实现自定义插值行为。自定义插补器示例包含两个java文件。例3-8显示了一个自定义插值器,用于计算动画的y坐标。例3-9显示了使用AnimationBooleanInterpolator的动画的代码片段。

例3-8自定义插补器

public class AnimationBooleanInterpolator extends Interpolator {@Overrideprotected double curve(double t) {return Math.abs(0.5-t)*2 ;}
}

示例3-9使用自定义插值器的动画

final KeyValue keyValue1 = new KeyValue(rect.xProperty(), 300);AnimationBooleanInterpolator yInterp = new AnimationBooleanInterpolator();final KeyValue keyValue2 = new KeyValue(rect.yProperty(), 0., yInterp);

应用文件

NetBeans项目 

  • animations.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《金色梦乡》金句摘抄(十一)

System.out.println("《金色梦乡》"); System.out.println("小说类型的书就是比散文类型的书好看"); System.out.println("通俗易懂"); System.out.println("今天准备看完");从一开始他就觉得难以置信&#xff0c;感觉就像是身处迷雾当…

ssl2295-暗黑破坏神【dp练习】

题目&#xff1a; 无聊中的小x玩起了Diablo I... 游戏的主人公有n个魔法 每个魔法分为若干个等级&#xff0c;第i个魔法有p[i]个等级(不包括0) 每个魔法的每个等级都有一个效果值&#xff0c;一个j级的i种魔法的效果值为w[i][j] 魔法升一级需要一本相应的魔法书 购买魔法书…

内存VS硬盘

一个程序和它的数据在被CPU执行前必须移到计算机的内存 中。 原因 内存存取数据的速度比硬盘的存取速度快10倍&#xff0c;在某些环境里&#xff0c;硬盘和内存之间的速度差距可能会更大。而CPU的速度比内存不知还要快多少倍。当我们把程序从硬盘放到内存以后&#xff0c;CPU…

依赖注入之Autofac使用总结

依赖倒置&#xff1f;控制反转&#xff08;IOC&#xff09;? 依赖注入&#xff08;DI&#xff09;&#xff1f; 你是否还在被这些名词所困扰&#xff0c;是否看了大量理论文章后还是一知半解了&#xff1f; 今天我想结合实际项目&#xff0c;和正在迷惑中的新手朋友一起来学…

JavaFX官方教程(十二)之树动画示例

翻译自 树动画示例 本章提供有关树动画示例的详细信息。您将了解场景中的所有元素是如何创建和动画的。 图4-1显示了带树的场景。 图4-1树动画 项目和要素 树动画项目由几个文件组成。每个元素&#xff0c;如树叶&#xff0c;草叶等&#xff0c;都是在不同的类中创建的。在…

《走遍中国》珍藏版(一)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");北京、天津…

MySQL建表,DML,DDL,约束,外键策略

创建数据库表 CREATE TABLE student( sno int (6), sname VARCHAR(10), sex CHAR(1), age INT(2), enterdate date, classname VARCHAR(10), email VARCHAR(15) ); – 查看表的结构 desc student – 查看表的数据 SELECT * FROM student DML – 查询表的数据 SELECT * FRO…

ssl1197-质数和分解【dp练习】

Description   任何大于 1 的自然数 n&#xff0c;都可以写成若干个大于等于 2 &#xff0c;且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况)&#xff0c;并且可能有不止一种质数和的形式。例如9 的质数和表达式就有四种本质不同的形式&#xff1a; 9 …

像素密度(衡量屏幕显示能力)

像素密度√[(长度像素数)^2(宽度像素数)^2]/屏幕尺寸 eg:

通过Roslyn构建自己的C#脚本(更新版)

之前写过文章介绍过如何通过Roslyn构建自己的C#脚本&#xff0c;但那篇文章是参考自Roslyn CTP版的&#xff0c;记得本来想等到Roslyn正式版出来重新更新一下文档的&#xff0c;不过记得后来Roslyn是跳票了的&#xff0c;Scripting API在正式版本中都一度被移除了&#xff0c;这…

JavaFX官方教程(十三)之应用效果

翻译自 Applying Effects 创建视觉效果包含以下主题&#xff1a; 混合效果 绽放效果 模糊效果 投影效果 内阴影效果 反射 照明效果 透视效果 创建一系列效果 介绍如何使用视觉效果来增强JavaFX应用程序的外观。 所有效果都位于javafx.scene.effect包中&#xff0c;…

《走遍中国》珍藏版(二)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");大门两侧傲…

单表查询

最简单的查询语句 select * from dept select * from emp; – 显示部分列 select empno,ename,sal ,comm,deptno from emp – 显示部分行 where select empno,ename,sal ,comm,deptno from emp where sal<2500 – 别名 select empno 编号,ename 姓名,sal 工资 ,comm 补助…

ssl1072-砝码称重【dp练习】

Description 设有1g、2g、3g、5g、10g、20g的砝码各若干枚&#xff08;其总重<1000&#xff09;&#xff0c; 要求&#xff1a; 输入方式&#xff1a;a1 a2 a3 a4 a5 a6 &#xff08;表示1g砝码有a1个&#xff0c;2g砝码有a2个&#xff0c;…&#xff0c;20g砝码有a6个&…

java中遍历树形菜单,你可能不知道还有这样的方法

版权声明&#xff1a;本文为CSDN博主「穆雄雄」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。原文链接&#xff1a;https://blog.csdn.net/qq_34137397/article/details/72654955穆雄雄开发工具&#xff1a;MyEclipse 10.5后台…

Docker-Compose 一键部署Ningx+.Net Core+Redis集群

在看该文章前&#xff0c;你需要对Docker有所了解。 1、创建WebApp应用程序 我使用的是.Net Core 1.0.1版本&#xff0c;创建一个MVC应用程序&#xff0c;并添加对Redis的引用。因为这些很基础&#xff0c;也很简单&#xff0c;这里就不详细说明了&#xff0c;特别提一下有关多…

JavaFX官方教程(十四)之转换,动画和视觉效果教程的源代码

翻译自 转换&#xff0c;动画和视觉效果教程的源代码 下表列出了本文档中的演示应用程序及其关联的源代码文件。 教程源代码NetBeans项目文件 转换概述 Xylophone.java transformations.zip 动画基础知识 animations.zip 树动画示例 tree_animation.zip 创建视觉效…

ssl2294-打包【dp练习】

Description 你现在拿到了许多的礼物&#xff0c;你要把这些礼物放进袋子里。你只有一个最多装下V 体积物品的袋子&#xff0c;你不能全部放进去。你也拿不动那么重的东西。你估计你能拿的最大重量为 G。现在你了解了每一个物品的完美值、重量和体积&#xff0c;你当然想让袋子…

《走遍中国》珍藏版(三)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");长廊的油漆…

Catalog Service - 解析微软微服务架构eShopOnContainers(三)

上一篇我们说了Identity Service&#xff0c;因为其基于IdentityServer4开发的&#xff0c;所以知识点不是很多&#xff0c;今天我们来看下Catalog Service&#xff0c;今后的讲解都会把不同的、重点的拿出来讲&#xff0c;希望大家明白。 源码分析 我们先看下它的目录结构&a…