使用JavaFX AnimationTimer
生活随笔
收集整理的這篇文章主要介紹了
使用JavaFX AnimationTimer
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
回想一下,給AnimationTimer起個名字可能不是一個好主意,因為它不僅可以用于動畫,還可以用于測量:fps速率,碰撞檢測,模擬步驟,游戲主循環(huán)等實際上,大部分時間我都看到了AnimationTimer的運行與動畫完全無關(guān)。 但是,在某些情況下,您可能要考慮為動畫使用AnimationTimer。 這篇文章將解釋該類,并顯示一個示例,其中將AnimationTimer用于計算動畫。 AnimationTimer提供了一個非常簡單但非常有用且靈活的功能。 它允許指定一個方法,該方法將在每一幀中調(diào)用。 此方法的用途不受限制,并且如前所述,與動畫沒有任何關(guān)系。 唯一的要求是,它必須快速返回,因為否則它很容易成為系統(tǒng)的瓶頸。 要使用它,開發(fā)人員必須擴展AnimationTimer并實現(xiàn)抽象方法handle()。 當AnimationTimer處于活動狀態(tài)時,將在每一幀中調(diào)用此方法。 單個參數(shù)傳遞給handle()。 它包含當前時間(以納秒為單位),與調(diào)用System.nanoTime()時的時間相同。 為什么要使用傳入的值而不是自己調(diào)用System.nanoTime()或它的弟弟System.currentTimeMillis()? 有多種原因,但最重要的可能是,它使調(diào)試時的生活變得更加輕松。 如果您曾經(jīng)嘗試調(diào)試依賴于這兩種方法的代碼,那么您就會知道自己基本上是一頭霧水。 但是,JavaFX運行時在調(diào)試期間等待執(zhí)行下一步時進入暫停狀態(tài),并且在此暫停期間內(nèi)部時鐘不會繼續(xù)運行。 換句話說,無論您在調(diào)試時恢復被暫停的程序之前等待了兩秒鐘還是兩個小時,參數(shù)的增量都將大致相同! AnimationTimer有兩個方法start()和stop()來激活和停用它。 如果覆蓋它們,則在超類中調(diào)用這些方法很重要。 Animation API帶有許多功能豐富的類,這些類使定義動畫非常簡單。 有預定義的過渡類,可以使用時間軸定義基于關(guān)鍵幀的動畫,甚至可以輕松編寫自定義過渡。 但是在哪些情況下使用AnimationTimer有意義? –幾乎總是要使用標準類之一。 但是,如果要指定許多簡單的動畫,則最好使用AnimationTimer。 標準動畫類的功能豐富性是有代價的。 每個動畫都需要跟蹤一大堆變量,而簡單動畫通常不需要這些變量。 另外,這些類針對速度進行了優(yōu)化,而不是針對較小的內(nèi)存占用。 有些變量存儲兩次,一次以公共API要求的格式存儲,一次以有助于在播放時更快地計算的格式存儲。 以下是顯示星空的簡單示例。 它可以動畫成千上萬個從中心飛到外邊緣的矩形。 使用AnimationTimer允許僅存儲所需的值。 例如,與時間軸內(nèi)的計算相比,該計算極其簡單,因為無需考慮高級功能(循環(huán),動畫速率,方向等)。 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
總結(jié)
以上是生活随笔為你收集整理的使用JavaFX AnimationTimer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看cpu核数和内存大小(li
- 下一篇: 企标备案号是什么(企标备案号)