AnimationTimer

JavaFX有三类动画实现方式:Transition,TimeLine和AnimationTimer。

AnimationTimer看起来像是一个计时器,其实他更适合叫做心跳循环。JavaFX绘图的每一帧都会自动条用AnimationTimer. AnimationTimer是一个抽象类。实现该类需要实现一个函数handle,其参数为调用时的nanoTime()。

public abstract void handle(long var1);
public void start();
public void stop();

AnimationTimer的start和stop函数分别是开始和停止handel被系统调用。

AnimationTimer的例子

实现一个FPS记录程序。这个例子中,我们点击开始按钮,下方标签的文字就会逐渐变得透明。而程序还同时记录当前的FPS,显示在图中,当前的FPS在图的标签中也会同步更新。

package com.example.timerdemo1import javafx.animation.AnimationTimer
import javafx.application.Application
import javafx.beans.binding.Bindings
import javafx.beans.property.SimpleDoubleProperty
import javafx.beans.property.SimpleObjectProperty
import javafx.collections.FXCollections
import javafx.geometry.Pos
import javafx.scene.Scene
import javafx.scene.chart.LineChart
import javafx.scene.chart.NumberAxis
import javafx.scene.chart.XYChart
import javafx.scene.control.Button
import javafx.scene.control.Label
import javafx.scene.layout.VBox
import javafx.scene.text.Font
import javafx.stage.Stage
import kotlin.math.roundToLongclass AnimationTimerSample : Application() {private var op = SimpleDoubleProperty(1.0)private val dtValues = SimpleObjectProperty(FXCollections.observableList(mutableListOf<XYChart.Data<Number, Number>>()))private val fps = SimpleDoubleProperty(0.0)override fun start(st: Stage) {initUI(st)}private fun initUI(st: Stage) {val tm = TimerMethod(op.value)// 三个元素纵向排列,间隔10.0以看起来更顺眼val sp = VBox(10.0).apply {alignment = Pos.CENTER// 开始按钮children.add(Button("开始").apply {font = Font.font(24.0)// 正在执行动画时按钮失效disableProperty().bind(Bindings.createBooleanBinding({op.value > 0 && op.value < 1}, op))// 按下按钮,启动标签透明度减小过程setOnAction {if (op.value <= 0 || op.value >= 1.0) {op.value = 1.0fps.value = 0.0dtValues.value.clear()tm.start()}}})// 绑定透明度属性到浮点属性,实现透明度变化children.add(Label("我是就要变得透明的大字!").apply {font = Font.font(36.0)opacityProperty().bind(op)})// 初始化一个线图,绑定线条的data,绑定线条的名称children.add(LineChart<Number, Number>(NumberAxis(0.0, tm.maximumCount, tm.maximumCount / 10.0),NumberAxis(0.0, 200.0, 20.0)).apply {animated = falsecreateSymbols = falseval dtLine = XYChart.Series<Number, Number>()dtLine.nameProperty().bind(Bindings.concat("当前FPS:", fps.asString().concat(" 1/s")))xAxis.label = "计数"yAxis.label = "FPS (1/s)"dtLine.dataProperty().bind(dtValues)dtValues.value.add(XYChart.Data(0, 0))data.add(dtLine)})}// 模板化窗口设置val sc = Scene(sp, 800.0, 600.0)st.title = "AnimationTimer示例"st.scene = scst.show()}// 实现逐帧循环心跳处理类private inner class TimerMethod(private val maxT: Double) : AnimationTimer() {// 用于计算时间差private var lastTime: Long = -1// 透明度递减的量private val dt = 0.01// 用于设置图形的最大X坐标val maximumCount: Doubleget() = maxT / dtoverride fun handle(now: Long) {if (lastTime <= -1) {dtValues.value.clear()} else {val n = dtValues.value.sizeval dt = now - lastTime// 去掉小数点后面的部分fps.value = (1e9 / dt).roundToLong().toDouble()// 增加数据点dtValues.value.add(XYChart.Data(n, fps.value))}lastTime = now// 改变透明度tick()}private fun tick() {op.value -= dt// 完全透明后自动停止心跳处理if (op.value <= 0) {stop()}}}
}fun main() {Application.launch(AnimationTimerSample::class.java)
}

就是这么简单!

JavaFX动画:有趣的AnimationTimer相关推荐

  1. javafx动画_JavaFX:创建Sprite动画

    javafx动画 到目前为止,尽管我的大多数文章都涉及JavaFX属性和绑定,但是今天我想写一讲我也致力于JavaFX运行时的另一部分:动画API. 在本文中,我将解释如何在JavaFX中编写自定义动 ...

  2. javafx 动画没效果_通过JavaFX标注制作动画效果

    javafx 动画没效果 在本文中,您将学习如何使用JavaFX的动画API创建标注. 您可以在https://www.youtube.com/watch?v=XTHbB0LRdT4的 YouTube ...

  3. javafx动画_JavaFX动画工具

    javafx动画 好的,我想是时候让您讲一个小秘密了. 最近三个月左右,我从事一个私人项目,目标是创建一个工具,使我可以轻松地为Java桌面应用程序创建动画. JavaFX在API级别上提供了出色的动 ...

  4. JavaFX动画工具

    好的,我想是时候让您讲一个小秘密了. 在过去的大约三个月中,我从事一个私有项目,目标是创建一个工具,使我可以轻松地为Java桌面应用程序创建动画. JavaFX在API级别上提供了出色的动画制作支持, ...

  5. android 原地弹跳动画,有趣的CSS弹跳动画

    这是只用了一个div来做的小动画,纯粹利用CSS3的animation来完成,就像是一个正方形在地上弹跳,碰到地面的时候尖角还会压缩变圆,阴影的部分也会随着正方形升高而缩小,至于到底该怎么完成呢?让我 ...

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

    翻译自  JavaFX中的动画和视觉效果 您可以使用JavaFX快速开发具有丰富用户体验的应用程序.在本入门教程中,您将学习如何使用非常少的编码创建动画对象并获得复杂的效果. 图7-1显示了要创建的应 ...

  7. javafx 使用_使用JavaFX AnimationTimer

    javafx 使用 回想一下,给AnimationTimer起个名字可能不是一个好主意,因为它不仅可以用于动画,还可以用于测量fps速率,碰撞检测,模拟步骤,游戏主循环等.实际上,我大部分时间都在看A ...

  8. java小时钟实验报告_JAVA实验报告(运用JavaFx实现时钟动画).doc

    JAVA实验报告(运用JavaFx实现时钟动画),javafx时钟,javafx动画,javafx等待动画,javafx动画效果,时钟动画,ppt时钟动画,时钟机关之星动画化,flash时钟动画,fl ...

  9. JavaFX 相关资源

    Libraries, Tools and Projects(类库,工具和项目) Advanced-Bindings for JavaFX(8) - 高级绑定是一组有用的帮助程序和自定义绑定实现,如ja ...

最新文章

  1. Oracle修改监听IP地址
  2. 使用DataReader、DataSet、DataAdapter和DataView
  3. 4月17日云栖精选夜读 | 在阿里做了五年技术主管,我有话想说
  4. 台湾大学林轩田机器学习技法课程学习笔记12 -- Neural Network
  5. python写一段脚本代码自动完成输入(目录下的所有)文件的数据替换(修改数据和替换数据都是输入的)【转】...
  6. stm32新建工程(详细)
  7. SVN的配置与使用方法
  8. 下单延迟10s撤单性能测试
  9. mySQL | unrecognized service 错误解决办法
  10. eclipse插件:OpenExplorer快速打开文件目录
  11. C++ 求解一整数划分问题
  12. 在php中新建一个系统,免费开源的PHP语言CMS系统充让您在一天内建立一个网站
  13. 下载eclipse太慢怎么办?
  14. premiere pr 裁剪视频音频
  15. 根据汉字自动生成拼音
  16. Splunk CIM
  17. 用GoldWave剪辑编辑视频中的音频文件
  18. chrome浏览器多开工具
  19. 手把手教你如何通过OAuth2.0新浪开放平台认证新浪用户-java
  20. python爬取微信小程序源代码_【实战】CrawlSpider实现微信小程序社区爬虫

热门文章

  1. yum卸载mysql_yum 安装卸载mysql
  2. 怎么修改mysql表的结构_MySQL数据库如何修改表结构
  3. Asp.net使用oledb方式连接SQL server
  4. Dubbo远程通信源码解析
  5. JS正则表达式(全)
  6. web应用程序与web网站的区别
  7. Unity中对Excel的操作(使用EPPlus)
  8. 无法登录苹果开发者_苹果企业开发者账号续费无法支付成功那些问题
  9. 二、美团大众点评CAT监控系列文章---CAT监控的服务端配置
  10. makefile中.PHONY的作用是什么?