通过JavaFX标注制作动画效果
在本文中,您將學(xué)習(xí)如何使用JavaFX的動畫API創(chuàng)建標(biāo)注。 您可以在https://www.youtube.com/watch?v=XTHbB0LRdT4的 YouTube網(wǎng)站上查看這些標(biāo)注的演示示例。
什么是標(biāo)注?
我敢肯定,您已經(jīng)看過廣告或科幻電影,它們使用在圖像頂部顯示的標(biāo)注來指示場景中的物體。 在本文中,您將學(xué)習(xí)如何使用JavaFX的Animation API創(chuàng)建動畫標(biāo)注效果。 使用這種效果,您可以將文本放置到場景中,然后通過線條或箭頭將文本連接到感興趣的項目。
圖1顯示了在本文的上下文中組合在一起構(gòu)成標(biāo)注的各個部分。
圖1.典型標(biāo)注的不同部分
以下是圖1中所示各個部分的定義:
- 頭部 –指示圖像中的項目的點(圓圈)
- 引導(dǎo)線 –從頭部到另一點的線,通常形成對角線
- 引伸線末端 – 引伸線段的末端 (水平線)
- 主標(biāo)題 –主標(biāo)題文本。 正文開始在引導(dǎo)線的終點滾動
- 字幕矩形 –來自主標(biāo)題底部的一個小動畫矩形
- 字幕 - 字幕文字。 字幕文本將在主標(biāo)題文本下方
并非所有標(biāo)注都相同。 不過,大多數(shù)將包含這些元素中的大多數(shù)。
標(biāo)注通常以靜態(tài)方式指出書籍或雜志中的內(nèi)容,但如果可以對標(biāo)注進(jìn)行動畫處理,則在視頻中要好得多。 一個不錯的動畫效果是從繪制一個點(頭)開始,然后畫一條線(引導(dǎo)線),然后滾動一個主標(biāo)題,最后滾動一個字幕。 當(dāng)動畫結(jié)束顯示時,它可以暫停一會兒(恰好足以允許觀看者閱讀標(biāo)題文本),然后將整個過程反向進(jìn)行,以退出場景。
動畫標(biāo)注
現(xiàn)在您知道了標(biāo)注的構(gòu)成,我們可以跳入一些JavaFX代碼來為圖1中所示的每個片段(1-6)設(shè)置動畫。
由于標(biāo)注的每個部分都是按順序進(jìn)行動畫處理的,因此您將首先創(chuàng)建一個javafx.animation.SequentialTransition實例。 一個SequentialTransition擁有零到許多Animation對象。 創(chuàng)建方法如下:
SequentialTransition calloutAnimation = new SequentialTransition();
顧名思義,動畫將按順序進(jìn)行。 您需要在calloutAnimation上設(shè)置的其他內(nèi)容是循環(huán)計數(shù)和自動反轉(zhuǎn)屬性。 例如:
// Allow animation to go in reversecalloutAnimation.setCycleCount(2);calloutAnimation.setAutoReverse(true);通過上述設(shè)置,動畫可以在閱讀者有時間查看和吸收標(biāo)注之后反轉(zhuǎn)順序。 若要添加動畫,請在順序過渡動畫對象上調(diào)用.getChildren()。add()方法。 以下是將頭部動畫添加到順序過渡動畫對象的代碼。 方法buildHeadAnim()返回一個javafx.animation.Animation實例。
// Animation of headCircle head = new Circle(600, 550, 5); // center x, y, radiushead.setFill(Color.WHITE);calloutAnimation.getChildren().add(buildHeadAnim(head));頭部動畫
為頭部創(chuàng)建動畫時,可以使用任何形狀,例如矩形或圓形。 在接下來的示例中,頭部是JavaFX Circle形狀。 動畫從零半徑開始,然后縮放到更大的半徑。 顯示的方法創(chuàng)建并返回一個javafx.animation.Timeline對象。
protected Animation buildHeadAnim(Node head) {Circle headCircle = (Circle) head;return new Timeline(new KeyFrame(Duration.millis(1),new KeyValue(headCircle.visibleProperty(), true),new KeyValue(headCircle.radiusProperty(), 0)), // start valuenew KeyFrame(Duration.millis(300),new KeyValue(headCircle.radiusProperty(), 5.0d)) // end value); }時間軸由一個初始關(guān)鍵幀組成,該初始關(guān)鍵幀將頭圈的visible屬性設(shè)置為true,并將radius屬性設(shè)置為零。 接下來,使用關(guān)鍵值定義結(jié)束關(guān)鍵幀,以在300毫秒內(nèi)將radius屬性從零插入到5.0。
領(lǐng)導(dǎo)線動畫
在設(shè)置引導(dǎo)線動畫時,該線將看起來就像是用鉛筆進(jìn)行描畫或繪制。 在下面的代碼中,將對端點坐標(biāo)進(jìn)行插值(線性)。 從頭部的中心(600,550)到lineToPoint坐標(biāo)(400,300)畫一條線。 我對值進(jìn)行了硬編碼,以使代碼更簡潔。 endX / endY的實際鍵值分別設(shè)置為getLeaderLineToPoint()。getX()和getLeaderLineToPoint()。getY() 。
protected Animation buildBeginLeaderLineAnim(Line leaderLine) {return new Timeline(new KeyFrame(Duration.millis(1),new KeyValue(leaderLine.visibleProperty(), true)),// shownew KeyFrame(Duration.millis(300),new KeyValue(leaderLine.endXProperty(), 400),new KeyValue(firstLeaderLine.endYProperty(), 300))); }領(lǐng)導(dǎo)線結(jié)束動畫
由于動畫化引線的末端部分的代碼將與以前的動畫非常相似,因此,我將省略該代碼。 要查看完整列表,請訪問: https : //github.com/carldea/callouts/tree/master/src/com/carlfx/callouts 。
主標(biāo)題文字動畫
主標(biāo)題文本動畫由一個HBox組成,該HBox包含一個Text節(jié)點,該文本節(jié)點將根據(jù)引線終點的方向向左或向右滾動。 例如,如果引出線終點的方向指向右側(cè),則主標(biāo)題文本將顯示為向右滾動。
以下是負(fù)責(zé)對主標(biāo)題文本進(jìn)行動畫處理的buildMainTitleAnim()方法。 由于該方法是標(biāo)注動畫中最復(fù)雜的部分,因此我想分享我在使用過程中遇到的一些技巧。
protected Animation buildMainTitleAnim(HBox mainTitleBackground) {// main title box// Calculate main title width and height upfrontRectangle2D mainTitleBounds = getBoundsUpfront(mainTitleBackground);double mainTitleWidth = mainTitleBounds.getWidth();double mainTitleHeight = mainTitleBounds.getHeight();// Position mainTitleText background beside the end part of the leader line.Point2D endPointLLine = calcEndPointOfLeaderLine();double x = endPointLLine.getX();double y = endPointLLine.getY();// Viewport to make main title appear to scrollRectangle mainTitleViewPort = new Rectangle();mainTitleViewPort.setWidth(0);mainTitleViewPort.setHeight(mainTitleHeight);mainTitleBackground.setClip(mainTitleViewPort);mainTitleBackground.setLayoutX(x);mainTitleBackground.setLayoutY(y - (mainTitleHeight/2));// Animate main title from end point to the left.if (LEFT == getEndLeaderLineDirection()) {// animate layout x and widthreturn new Timeline(new KeyFrame(Duration.millis(1),new KeyValue(mainTitleBackground.visibleProperty(), true),new KeyValue(mainTitleBackground.layoutXProperty(), x)), // shownew KeyFrame(Duration.millis(200),new KeyValue(mainTitleBackground.layoutXProperty(), x - mainTitleWidth),new KeyValue(mainTitleViewPort.widthProperty(), mainTitleWidth)));}// Animate main title from end point to the rightreturn new Timeline(new KeyFrame(Duration.millis(1),new KeyValue(mainTitleBackground.visibleProperty(), true)), // shownew KeyFrame(Duration.millis(200),new KeyValue(mainTitleViewPort.widthProperty(), mainTitleWidth))); }放置主標(biāo)題文本時,您的代碼將需要預(yù)先知道邊界區(qū)域的大小。 下面是一種方法,該方法采用包含文本節(jié)點的HBox,然后計算HBox的寬度和高度,而不必在主場景圖上顯示該框。
protected Rectangle2D getBoundsUpfront(Region node) {// Calculate main title width and heightGroup titleRoot = new Group();new Scene(titleRoot);titleRoot.getChildren().add(node);titleRoot.applyCss();titleRoot.layout();return new Rectangle2D(0, 0, node.getWidth(), node.getHeight()); }您可以在此示例中看到javafx.scene.Node類中的applyCss()和layout()方法如何負(fù)責(zé)在應(yīng)用CSS樣式后確定寬度和高度。 在上方,您會發(fā)現(xiàn)一個場景是臨時創(chuàng)建的。
字幕動畫
為了簡潔起見,我省略了字幕動畫。 我相信您會看到我在Github上提到的完整代碼清單。 在動畫的初始開始和內(nèi)插到結(jié)束鍵值方面,字幕動畫均遵循與標(biāo)題動畫相同的模式。
播放標(biāo)注動畫
假設(shè)將構(gòu)成標(biāo)注的節(jié)點添加到JavaFX Pane布局節(jié)點,則需要停止順序動畫calloutAnimation 。 然后,您需要初始化所有不顯示的節(jié)點(visible屬性設(shè)置為false)。 最后,您需要調(diào)用play()方法。
getChildren().addAll(head,firstLeaderLine,secondLeaderLine,mainTitle,subTitleRect,subTitle);calloutAnimation.stop();getChildren().forEach(node -> node.setVisible(false));calloutAnimation.play();結(jié)論
通過使用JavaFX的動畫API和簡單的形狀,創(chuàng)建動畫標(biāo)注非常容易。 在本文中,您學(xué)習(xí)了如何使用SequentialTransition對象來順序調(diào)用較小的動畫(時間軸)。
構(gòu)建每個時間軸動畫的標(biāo)注的每個步驟,將使用根據(jù)形狀屬性(例如圓的半徑)在關(guān)鍵值上插值的關(guān)鍵幀。 之后,在學(xué)習(xí)如何對引導(dǎo)線進(jìn)行動畫處理之后,您還學(xué)到了一個巧妙的技巧,該技巧可以通過applyCss()和layout()方法確定主標(biāo)題文本的大小。 由于樣式和字體大小的原因,在將UI組件呈現(xiàn)到主場景圖上之前,很難知道它的大小。
現(xiàn)在,您知道如何實現(xiàn)動畫標(biāo)注,我相信您將使應(yīng)用程序更具吸引力。 編碼愉快!
翻譯自: https://www.javacodegeeks.com/2018/10/animated-effects-javafx-callouts.html
總結(jié)
以上是生活随笔為你收集整理的通过JavaFX标注制作动画效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Java EE和OIDC构建Java
- 下一篇: java 1.8新增功能_Java 8的