使用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.pswp.cn/news/372303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372303.shtml
英文地址,請注明出處:http://en.pswp.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> } 創建函數不需要…