JavaFX官方教程(八)之JavaFX中的动画和视觉效果

翻译自  JavaFX中的动画和视觉效果

您可以使用JavaFX快速开发具有丰富用户体验的应用程序。在本入门教程中,您将学习如何使用非常少的编码创建动画对象并获得复杂的效果。

图7-1显示了要创建的应用程序。

图7-1彩色圆圈应用

图7-2显示了该ColorfulCircles应用程序的场景图。分支的节点是Group类的实例化,而非分支节点(也称为叶节点)是RectangleCircle类的实例化。

图7-2彩色圆圈场景图

本入门教程中使用的工具是NetBeans IDE。在开始之前,请确保您使用的NetBeans IDE版本支持JavaFX 8.有关详细信息,请参阅Java SE下载页面的“认证系统配置”部分。

 

1、设置应用程序

在NetBeans IDE中设置JavaFX项目,如下所示:

  1. 从“ 文件”菜单中,选择“ 新建项目”

  2. JavaFX应用程序类别中,选择JavaFX Application。单击下一步

  3. 将项目命名为ColorfulCircles,然后单击Finish

  4. 删除NetBeans IDE生成的import语句。

    通过使用NetBeans IDE中的“源”菜单中的“代码完成”功能或“修复导入”命令,您可以在完成本教程的过程中生成导入语句。如果可以选择import语句,请选择以开头语句开头的语句javafx

 

2、设置项目

ColorfulCircles从NetBeans IDE生成的源文件中删除该类,并将其替换为示例7-1中的代码。

例7-1基本应用

public class ColorfulCircles extends Application {@Overridepublic void start(Stage primaryStage) {Group root = new Group();Scene scene = new Scene(root, 800, 600, Color.BLACK);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

对于ColorfulCircles应用程序,使用组节点作为场景的根节点是合适的。组的大小取决于其中节点的大小。但是,对于大多数应用程序,您希望节点跟踪场景的大小,并在调整舞台大小时进行更改。在这种情况下,您使用可调整大小的布局节点作为根,如在JavaFX中创建表单中所述。

您现在可以编译并运行ColorfulCircles应用程序,并在本教程的每个步骤中查看中间结果。如果遇到问题,请查看ColorfulCircles.java文件中的代码,该代码包含在可下载的ColorfulCircles.zip文件中。此时,应用程序是一个简单的黑色窗口。

 

3、添加图形

接下来,通过在行之前添加示例7-2中的代码来创建30个圆圈primaryStage.show()

例7-2 30圈

Group circles = new Group();
for (int i = 0; i < 30; i++) {Circle circle = new Circle(150, Color.web("white", 0.05));circle.setStrokeType(StrokeType.OUTSIDE);circle.setStroke(Color.web("white", 0.16));circle.setStrokeWidth(4);circles.getChildren().add(circle);
}
root.getChildren().add(circles);

此代码创建一个名为group的组circles,然后使用for循环向该组添加30个圆圈。每个圆的半径为150,填充颜色white和不透明度5百分比,这意味着它大部分是透明的。

要在圆圈周围创建边框,代码中包含StrokeType该类。笔划类型OUTSIDE意味着圆的边界在内部延伸了StrokeWidth值,即4。笔划的颜色是white,不透明度级别是16百分比,使其比圆圈的颜色更亮。

最后一行将circles组添加到根节点。这是一个临时结构。稍后,您将修改此场景图以匹配图7-2中所示的场景图。

图7-3显示了该应用程序。由于代码尚未为每个圆圈指定唯一的位置,因此圆圈将相互重叠绘制,窗口的左上角作为圆圈的中心点。重叠圆圈的不透明度与黑色背景相互作用,产生圆圈的灰色。

图7-3圈子



4、添加视觉效果

继续对圆圈应用框模糊效果,使它们看起来略微失焦。代码在例7-3中。primaryStage.show()在行之前添加此代码。

例7-3盒子模糊效果

circles.setEffect(new BoxBlur(10,10,3));

此代码将模糊半径设置为10像素宽,10像素高,以及模糊迭代,3,使其接近高斯模糊。这种模糊技术会在圆的边缘产生平滑效果,如图7-4所示。

图7-4圆上的框模糊


5、创建背景渐变

现在,创建一个矩形并用线性渐变填充它,如例7-4所示。

root.getChildren().add(circles)在行之前添加代码,以便渐变矩形出现在圆圈后面。

例7-4线性梯度

Rectangle colors = new Rectangle(scene.getWidth(), scene.getHeight(),new LinearGradient(0f, 1f, 1f, 0f, true, CycleMethod.NO_CYCLE, new Stop[]{new Stop(0, Color.web("#f8bd55")),new Stop(0.14, Color.web("#c0fe56")),new Stop(0.28, Color.web("#5dfbc1")),new Stop(0.43, Color.web("#64c2f8")),new Stop(0.57, Color.web("#be4af7")),new Stop(0.71, Color.web("#ed5fc2")),new Stop(0.85, Color.web("#ef504c")),new Stop(1, Color.web("#f2660f")),}));
colors.widthProperty().bind(scene.widthProperty());
colors.heightProperty().bind(scene.heightProperty());
root.getChildren().add(colors);

此代码创建一个名为的矩形colors。矩形与场景的宽度和高度相同,并且填充了从左下角(0,1)开始并在右上角(1,0)结束的线性渐变。值true表示渐变与矩形成比例,NO_CYCLE表示颜色循环不会重复。该Stop[]序列表示在特定点处的渐变颜色应该是什么。

接下来的两行代码通过将矩形的宽度和高度绑定到场景的宽度和高度来使线性渐变调整为场景的大小。有关绑定的更多信息,请参阅使用JavaFX属性和绑定。

最后一行代码将colors矩形添加到根节点。

带有模糊边缘的灰色圆圈现在出现在彩虹色的顶部,如图7-5所示。

图7-5线性梯度

图7-6显示了中间场景图。此时,circles组和colors矩形是根节点的子节点。

图7-6中间场景图



6、应用混合模式

接下来,通过添加叠加混合效果为圆圈添加颜色并使场景变暗。您将从circles场景图中删除组和线性渐变矩形,并将它们添加到新的叠加混合组。

找到以下两行代码:

root.getChildren().add(colors);
root.getChildren().add(circles);

用例7-5中的代码替换步骤1中的两行代码。

例7-5混合模式

Group blendModeGroup = new Group(new Group(new Rectangle(scene.getWidth(), scene.getHeight(),Color.BLACK), circles), colors);
colors.setBlendMode(BlendMode.OVERLAY);
root.getChildren().add(blendModeGroup);

该组blendModeGroup设置叠加混合的结构。该小组包含两名儿童。第一个子节点是一个新的(未命名的)Group包含一个新的(未命名的)黑色矩形和先前创建的circles组。第二个孩子是先前创建的colors矩形。

setBlendMode()方法将叠加混合应用于colors矩形。最后一行代码将blendModeGroup场景图添加为根节点的子节点,如图7-2所示。

叠加混合是图形设计应用中的常见效果。这种混合可以使图像变暗或添加高光或两者,具体取决于混合中的颜色。在这种情况下,线性渐变矩形用作叠加。黑色矩形用于保持背景黑暗,而近乎透明的圆圈从渐变中拾取颜色,但也变暗。

图7-7显示了结果。在下一步中为圆圈设置动画时,您将看到叠加混合的完整效果。

图7-7叠加混合


7、添加动画

最后一步是使用JavaFX动画来移动圆圈:

  1. 如果尚未执行此操作,请添加import static java.lang.Math.random;到import语句列表中。

在行之前添加示例7-6中的动画代码primaryStage.show()

例7-6动画

Timeline timeline = new Timeline();
for (Node circle: circles.getChildren()) {timeline.getKeyFrames().addAll(new KeyFrame(Duration.ZERO, // set start position at 0new KeyValue(circle.translateXProperty(), random() * 800),new KeyValue(circle.translateYProperty(), random() * 600)),new KeyFrame(new Duration(40000), // set end position at 40snew KeyValue(circle.translateXProperty(), random() * 800),new KeyValue(circle.translateYProperty(), random() * 600)));
}
// play 40s of animation
timeline.play();

动画由时间轴驱动,因此此代码创建时间轴,然后使用for循环向30个圆中的每一个添加两个关键帧。0秒处的第一个关键帧使用属性translateXPropertytranslateYProperty在窗口内设置圆圈的随机位置。40秒的第二个关键帧也是如此。因此,当播放时间线时,它在40秒的时间段内将所有圆圈从一个随机位置动画到另一个随机位置。

图7-8显示了30个运动中的彩色圆圈,完成了应用程序。有关完整的源代码,请参阅该ColorfulCircles.java文件,该文件包含在可下载的ColorfulCircles.zip文件中。

图7-8动画圆圈


8、从这往哪儿走

以下是有关下一步操作的几点建议:

  • 试试JavaFX示例,您可以从Java SE下载页面的JDK演示和示例部分下载该示例http://www.oracle.com/technetwork/java/javase/downloads/。特别是看看Ensemble应用程序,它为动画和效果提供示例代码。

  • 阅读JavaFX中的创建过渡和时间轴动画。您将找到有关时间轴动画的更多详细信息以及有关淡入淡出,路径,并行和顺序转换的信息。

  • 有关增强应用程序外观和设计的其他方法,请参阅在JavaFX中创建视觉效果,包括反射,光照和阴影效果。

  • 尝试使用JavaFX Scene Builder工具创建视觉上有趣的应用程序。此工具提供了一个可视化布局环境,用于为JavaFX应用程序设计UI并生成FXML代码。您可以使用菜单栏的“属性”面板或“修改”选项将效果添加到UI元素。有关信息,请参阅“JavaFX Scene Builder用户指南”的“属性”面板和“菜单栏”部分。

 

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

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

相关文章

《金色梦乡》金句摘抄(九)

System.out.println("《金色梦乡》"); System.out.println("小说类型的书就是比散文类型的书好看"); System.out.println("通俗易懂"); System.out.println("这周能看完");他在观察&#xff0c;就像饲养员为了掌握动物的情况和习性而观…

广搜(初见)

以下是广搜水题 题意&#xff1a;输入一个n*n的迷宫&#xff0c;输入从起点到终点的最短路 输入&#xff1a; 12 //迷宫大小 2 9 11 8 //起点和终点 1 1 1 1 1 1 1 1 1 1 1 1 //邻接矩阵&#xff0c;0表示通&#xff0c;1表示不通 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 0 …

.Net Core 图片文件上传下载

当下.Net Core项目可是如雨后春笋一般发展起来&#xff0c;作为.Net大军中的一员&#xff0c;我热忱地拥抱了.Net Core并且积极使用其进行业务的开发&#xff0c;我们先介绍下.Net Core项目下实现文件上传下载接口。 一、开发环境 毋庸置疑&#xff0c;宇宙第一IDE VisualStu…

JavaFX官方教程(九)之转换

翻译自 Transformations Overview 本章介绍JavaFX中支持的转换。 所有转换都位于javafx.scene.transform包中&#xff0c;并且是类的子Transform类。 介绍转换 变换根据某些参数改变坐标系中图形对象的位置。JavaFX支持以下类型的转换&#xff1a; 翻译 回转 缩放 剪毛 …

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

System.out.println("《金色梦乡》"); System.out.println("小说类型的书就是比散文类型的书好看"); System.out.println("通俗易懂"); System.out.println("这周能看完");“面对遭受迫害的人&#xff0c;有人选择拯救&#xff0c;有人…

stream流把list转为map

1.对象中的属性转map 通过Collectors.toMap list.stream().collect(Collectors.toMap(Person::getId,Person::getName)); 2.收集对象本身 list.stream().collect(Collectors.toMap(Person::getId,list->list)

广搜(练习4题)

几道例题还比较简单&#xff0c;练习就卡了比较长的时间了(。_。) 所以我会写一下解题思路了(๑ŐдŐ) 还有博客抽风所以代码里会有一些奇奇怪怪的东西&#xff0c;无视就好了qwq。 这几道题我就按各人认为的难易程度来排序吧QAQ。 第一题. 题意&#xff1a;输入一个迷宫&…

谈一下我们是怎么做数据库单元测试(Database Unit Test)的

背景介绍 最近在团队在做release之前的regression,把各个feature分支merge回master之后发现DB的单元测试出现了20多个失败的test cases。之前没怎么做过DB的单元测试&#xff0c;正好借这个机会熟悉一下写DB单元测试的流程。 这篇博文中首先介绍一下在我们的特定项目场景中是…

JavaFX官方教程(十)之转换类型和示例

翻译自 Transformation Types and Examples 本文档描述了特定的转换并提供了代码示例。 转换 平移变换沿着相对于其初始位置的一个轴将节点从一个位置移动到另一个位置。木琴条的初始位置由x&#xff0c;y和z坐标定义。在实施例2-1中&#xff0c;初始位置值由指定的xStart&a…

ssl2293-暗黑游戏【dp练习题】

题目&#xff1a; 暗黑游戏中&#xff0c;装备直接决定玩家人物的能力。可以使用Pg和Rune购买需要的物品。暗黑市场中的装备&#xff0c;每件有不同的价格&#xff08;Pg和Rune&#xff09;、能力值、最大可购买件数。Kid作为暗黑战网的一个玩家&#xff0c;当然希望使用尽可能…

java知识点整理

1.char类型可以整型类型的值 2.变量的命名规则&#xff1a; (1)由字母、、$ 开头的 (2)后面部分可以拾字母、数字、下划线、$ (3)不能是java的关键词 (4)变量名要有意义 3.0是偶数 4.数据类型转换规则&#xff1a; int(源类型) a 1.0(目标类型); (1)源类型大于目标类型&#…

比特(bit)和字节(byte)(1byte=8bit)

一个0或者一个1存储为一个比特(bit)&#xff0c;是计算机中最小的存储单位。 计算机中是最基本的存储单元是字节(byte) 。每个字节由8个比特构成。

定位

绝对定位 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>.div1{height: 200px;width: 200px;background-color: gray;/*绝对定位 基于父级标签原点移开以后会自动释放父级标签原点位置*/po…

Web前端知识体系精简

Web前端技术由html、css和javascript三大部分构成&#xff0c;是一个庞大而复杂的技术体系&#xff0c;其复杂程度不低于任何一门后端语言。而我们在学习它的时候往往是先从某一个点切入&#xff0c;然后不断地接触和学习新的知识点&#xff0c;因此对于初学者很难理清楚整个体…

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

翻译自 动画基础 动画基础提供基本动画概念&#xff0c;包含以下部分&#xff1a; 转变 时间线动画 插值 JavaFX中的动画可以分为时间轴动画和过渡。本章提供了每种动画类型的示例。 Timeline并且Transition是javafx.animation.Animation该类的子类。有关特定类&#xff…

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

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;和正在迷惑中的新手朋友一起来学…