使用JavaFX AnimationTimer

回想一下,给AnimationTimer起个名字可能不是一个好主意,因为它不仅可以用于动画,还可以用于测量:fps速率,碰撞检测,模拟步骤,游戏主循环等实际上,大部分时间我都看到了AnimationTimer的运行与动画完全无关。 但是,在某些情况下,您可能要考虑为动画使用AnimationTimer。 这篇文章将解释该类,并显示一个示例,其中将AnimationTimer用于计算动画。
AnimationTimer提供了一个非常简单但非常有用且灵活的功能。 它允许指定一个方法,该方法将在每一帧中调用。 此方法的用途不受限制,并且如前所述,与动画没有任何关系。 唯一的要求是,它必须快速返回,因为否则它很容易成为系统的瓶颈。
要使用它,开发人员必须扩展AnimationTimer并实现抽象方法handle()。 当AnimationTimer处于活动状态时,将在每一帧中调用此方法。 单个参数传递给handle()。 它包含当前时间(以纳秒为单位),与调用System.nanoTime()时的时间相同。
为什么要使用传入的值而不是自己调用System.nanoTime()或它的弟弟System.currentTimeMillis()? 有多种原因,但最重要的可能是,它使调试时的生活变得更加轻松。 如果您曾经尝试调试依赖于这两种方法的代码,那么您就会知道自己基本上是一头雾水。 但是,JavaFX运行时在调试期间等待执行下一步时进入暂停状态,并且在此暂停期间内部时钟不会继续运行。 换句话说,无论您在调试时恢复被暂停的程序之前等待了两秒钟还是两个小时,参数的增量都将大致相同!
AnimationTimer有两个方法start()和stop()来激活和停用它。 如果覆盖它们,则在超类中调用这些方法很重要。
Animation API带有许多功能丰富的类,这些类使定义动画非常简单。 有预定义的过渡类,可以使用时间轴定义基于关键帧的动画,甚至可以轻松编写自定义过渡。 但是在哪些情况下使用AnimationTimer有意义? –几乎总是要使用标准类之一。 但是,如果要指定许多简单的动画,则最好使用AnimationTimer。
标准动画类的功能丰富性是有代价的。 每个动画都需要跟踪一大堆变量,而简单动画通常不需要这些变量。 另外,这些类针对速度进行了优化,而不是针对较小的内存占用。 有些变量存储两次,一次以公共API要求的格式存储,一次以有助于在播放时更快地计算的格式存储。
以下是显示星空的简单示例。 它可以动画成千上万个从中心飞到外边缘的矩形。 使用AnimationTimer允许仅存储所需的值。 例如,与时间轴内的计算相比,该计算极其简单,因为无需考虑高级功能(循环,动画速率,方向等)。
package fxsandbox;import java.util.Random;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;public class FXSandbox extends Application {private static final int STAR_COUNT = 20000;private final Rectangle[] nodes = new Rectangle[STAR_COUNT];private final double[] angles = new double[STAR_COUNT];private final long[] start = new long[STAR_COUNT];private final Random random = new Random();@Overridepublic void start(final Stage primaryStage) {for (int i=0; i<STAR_COUNT; i++) {nodes[i] = new Rectangle(1, 1, Color.WHITE);angles[i] = 2.0 * Math.PI * random.nextDouble();start[i] = random.nextInt(2000000000);}final Scene scene = new Scene(new Group(nodes), 800, 600, Color.BLACK);primaryStage.setScene(scene);primaryStage.show();new AnimationTimer() {@Overridepublic void handle(long now) {final double width = 0.5 * primaryStage.getWidth();final double height = 0.5 * primaryStage.getHeight();final double radius = Math.sqrt(2) * Math.max(width, height);for (int i=0; i<STAR_COUNT; i++) {final Node node = nodes[i];final double angle = angles[i];final long t = (now - start[i]) % 2000000000;final double d = t * radius / 2000000000.0;node.setTranslateX(Math.cos(angle) * d + width);node.setTranslateY(Math.sin(angle) * d + height);}}}.start();}public static void main(String[] args) {launch(args);}}

参考:在Mike's Blog博客上使用 JCG合作伙伴 Michael Heinrichs 的JavaFX AnimationTimer 。


翻译自: https://www.javacodegeeks.com/2012/06/using-javafx-animationtimer.html

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

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

相关文章

python列表姓氏_python数据分析实例(六) 中国姓氏数据

bokeh联动柱状图&#xff0c;Excel空间柱状图、空间热力图&#xff0c;Echarts空间柱状图&#xff0c;常用函数&#xff1a;df[工作地_省] df[工作地].str.split(省).str[0]df[工作地_市] df[工作地_市] df[工作地].str.split(省).str[1].str.split(市).str[0]df[工作地_市][…

JavaFX 2 GameTutorial第3部分

介绍 Ť他是与一个六个部分组成的系列的第3部分的JavaFX 2游戏教程。 如果您错过了第1部分和第2部分 &#xff0c;建议您在开始本教程之前先进行阅读。 回顾第二部分&#xff0c;我讨论了游戏循环的内部工作原理&#xff0c;其中我们使用动画&#xff08;JavaFX Timeline &…

Selenium WebDriver + python 自动化测试框架

目标 组内任何人都可以进行自动化测试用例的编写 完全分离测试用例和自动化测试代码&#xff0c;就像写手工测试用例一下&#xff0c;编写excel格式的测试用例&#xff0c;包括步骤、检查点&#xff0c;然后执行自动化工程&#xff0c;即可执行功能自动化测试用例&#xff0c;包…

mysql游戏减少积分活动图_plantuml-绘制状态图和活动图和部署图​

背景状态图&#xff1a;对象的所有状态&#xff0c;以及基于事件发生的状态改变的过程&#xff1b;活动图&#xff1a;用例的工作流程&#xff1b;部署图&#xff1a;系统的软硬件物理体系结构&#xff1b;状态图基本语法元素语法说明开始和结束状态[*]标识开始和结束状态箭头-…

windows中当你的键盘无法使用时我们可以用另一种方法哦

1.使用WinR打开cmd窗口 2.输入osk回车就出现了一个虚拟的小键盘啦&#xff0c;当你的键盘坏掉后非常实用哦 转载于:https://www.cnblogs.com/qianzf/p/6780496.html

python web.py 404_找不到web.py开发服务器-favicon.ico-404

py API文档引用了一个“web.SEE OTHER()”函数&#xff0c;该函数生成一个303 SEE OTHER响应&#xff0c;将浏览器重定向到另一个位置。(请参见http://webpy.org/docs/0.3/api#web.application)这是一个服务器端的解决方案&#xff0c;它不需要在html文件中更改头&#xff1b;如…

NetBeans 7.2引入了TestNG

代码生成的优点之一是能够查看如何使用特定的语言功能或框架。 正如我在《 NetBeans 7.2 beta&#xff1a;更快&#xff0c;更有用》一文中所讨论的那样&#xff0c; NetBeans 7.2 beta提供了TestNG集成 。 除了对该功能的单一引用之外&#xff0c;我在该帖子中没有进一步阐述&…

Javascript模块化编程(三):require.js的用法

一、为什么要用require.js&#xff1f; 最早的时候&#xff0c;所有Javascript代码都写在一个文件里面&#xff0c;只要加载这一个文件就够了。后来&#xff0c;代码越来越多&#xff0c;一个文件不够了&#xff0c;必须分成多个文件&#xff0c;依次加载。下面的网页代码&…

[KISSY5系列]淘宝全终端框架 KISSY 5--从零开始使用

KISSY 是淘宝一个开源的 JavaScript 库&#xff0c;包含的组件有&#xff1a;日历、图片放大镜、卡片切换、弹出窗口、输入建议等 一、简介 KISSY 是一款跨终端、模块化、高性能、使用简单的 JavaScript 框架。 除了完备的工具集合如 DOM、Event、Ajax、Anim 等它还提供了经典的…

几万条数据的excel导入到mysql_【记录】2万多条数据的Excel表格数据导入mysql数据库...

主题刚开始的时候做了两个小方案&#xff01;第一个是直接Excel处理完导入&#xff0c;但是这个导入的话虽然简单出错率很大&#xff01;第二个是想直接用php做个小程序直接导入数据&#xff0c;但是想了想2万条数据处理&#xff0c;百分之百浏览器会一直转&#xff0c;最后不知…

JDeveloper中的Java反编译器

Java Decompiler是一个独立的图形实用程序&#xff0c;显示“ .class”文件的Java源代码。 下面是Java Decompiler程序的快照 您可以从这里下载该程序 我将说明如何将此程序用作Jdeveloper中的外部工具 Java Decompiler和Jdeveloper之间的集成 您可以将此程序添加到Jdevelo…

NGUI学习随笔

一、NGUI的直接用法 1. Attach a Collider&#xff1a;表示为NGUI的某些物体添加碰撞器&#xff0c;如果界面是用NGUI做的&#xff0c;只能这样添加。&#xff08;注&#xff1a;用Component添加无效&#xff09;。2. Attach an Anchor&#xff1a;表示为该物体添加了…

Git 修改源地址

git remote set-url origin http://git.xxx.com/xxx/repo.git 转载于:https://www.cnblogs.com/savokiss/p/5892543.html

mysql主从进行扩展_MySQL 主从扩展

MySQL 主从扩展常见问题排查1. 数据不一致:SHOW SLAVE STATUS \G;Last_Errno:1062Last_Error:ErrorDuplicate entryxxxn-66-77for key1on query.Defaultdatabase:guild.Query:insert into pynpcrecord setMapCode xxxn, UpdateTime 2015-08-0700:00:32解决方法: 在从库上将重复…

JRockit – JRCMD有用的命令

自2007年以来&#xff0c;我一直在使用JRockit。我发现它比Hotspot速度慢&#xff0c;但在诊断和分析问题上总是更好。 从去年夏天开始&#xff0c;我一直在为一家国际电信系统供应商工作。 我们在HP OpenCall Convergent Communication Platform之上为电信运营商设计和实施各种…

Spark Streaming整合logstash + Kafka wordCount

1、安装logstash&#xff0c;直接解压即可 测试logstash是否可以正常运行 bin/logstash -e input { stdin { } } output { stdout {codec > rubydebug } } 只获取消息 bin/logstash -e input { stdin { } } output { stdout {codec > plain { format > "%{messag…

js 变量类型

变量类型分为&#xff1a;基础类型和引用类型 基础类型&#xff1a;boolean, string, number, null, undefined, symbol 引用类型&#xff1a; array, object typeof: 判断变量的类型instanceof:判断某个对象是否是另外一个对象的实例主要还是理解这两个判断的不同之处&#xf…

python 相对导入_python 相对导入与绝对导入

Python 相对导入与绝对导入Python | Jul 21, 2016 | pythonPython 相对导入与绝对导入&#xff0c;这两个概念是相对于包内导入而言的。包内导入即是包内的模块导入包内部的模块。Python import 的搜索路径1.在当前目录下搜索该模块2.在环境变量 sys.path 中指定的路径列表中依…

具有Java Kickstart的MongoDB

NoSQL数据库由于其可伸缩性而变得越来越流行。 适当使用时 NoSQL数据库可以提供真正的好处。 MongoDB是使用C 编写的高度可扩展的开源NoSQL数据库。 1.安装MongoDB 您可以根据所使用的操作系统&#xff0c;按照MongoDB官方网站上的说明安装MongoDB&#xff0c;而不会遇到很多麻…

Linux Shell——函数的使用

文/一介书生&#xff0c;一枚码农。 scripts are for lazy people. 函数是存在内存里的一组代码的命名的元素。函数创建于脚本运行环境之中&#xff0c;并且可以执行。 函数的语法结构为&#xff1a; function <function-name> {<code to execute> } 创建函数不需要…