TornadoFX編程指南,第9章,形狀和動畫

譯自《Shapes and Animation

形狀和動畫

JavaFX帶有幾乎表示任何幾何形狀的節點,以及一個Path節點,它提供組裝和管理幾何路徑所需的工具(以創建自定義形狀)。 JavaFX還具有動畫支持,逐漸改變Node屬性,創建兩個狀態之間的視覺轉換。 TornadoFX旨在通過構建器構造來簡化所有這些功能。

形狀基礎(Shape Basics)

形狀構建器的每個參數都是可選的,在大多數情況下,默認值為0.0 。 這意味著您只需要提供您關心的參數。 構建器具有每個形狀的大多數屬性的位置參數,其余的可以設置在隨后的函數塊中。 因此,這些都是創建矩形的有效方式:

rectangle {
    width = 100.0
    height = 100.0
}

rectangle(width = 100.0, height = 100.0)

rectangle(0.0, 0.0, 100.0, 100.0)

您選擇的形式是偏好的問題,但顯然需要考慮到您編寫的代碼的易讀性。 為了清楚起見,本章中的示例指定了代碼塊中的大部分屬性,除非沒有代碼塊支持或參數是非常自明的。

在父項內定位

大多數形狀構建器可以讓您選擇在父項中指定形狀的位置。 這是否有任何影響取決于父節點。 除非您在形狀上調用setManaged(false),否則HBox不會關心您指定的xy坐標。 但是,Group控件將會關心這一點。 以下示例中的截圖將通過在一個Group周圍包裝一個StackPane,并最后在該Group內創建形狀,如下所示。

class MyView: View() {

    override val root =  stackpane {
       group {
            //shapes will go here
       }
    }
}

長方形(Rectangle)

Rectangle定義了一個矩形,其中可選的大小和位置在父項中。 可以使用arcWidtharcHeight屬性指定圓角(圖9.1)。

rectangle {
    fill = Color.BLUE
    width = 300.0
    height = 150.0
    arcWidth = 20.0
    arcHeight = 20.0
}
圖9.1

弧形(Arc)

Arc表示由中心(center),起始角度(start angle),角度范圍(angular extent,以度計的弧度)和圓弧類型(arc type, OPEN, CHORD或ROUND )定義的弧形對象(圖9.2)

arc {
    centerX = 200.0
    centerY = 200.0
    radiusX = 50.0
    radiusY = 50.0
    startAngle = 45.0
    length = 250.0
    type = ArcType.ROUND
}
圖9.2

圓圈(Circle)

Circle表示具有指定radiuscenter的圓。

circle {
    centerX = 100.0
    centerY = 100.0
    radius = 50.0
}

CubicCurve

CubicCurve表示(x,y)坐標空間中的立方貝塞爾參數曲線段(cubic Bézier parametric curve segment)。 使用指定點(controlX1, controlY1) 和(controlX2, controlY2) 作為Bézier控制點,繪制與指定的坐標(startX, startY)和(endX, enfY)相交的曲線。

cubiccurve {
    startX = 0.0
    startY = 50.0
    controlX1 = 25.0
    controlY1 = 0.0
    controlX2 = 75.0
    controlY2 = 100.0
    endX = 150.0
    endY = 50.0
    fill = Color.GREEN
}

橢圓(Ellipse)

Ellipse表示具有指定大小和位置參數的橢圓。

ellipse {
    centerX = 50.0
    centerY = 50.0
    radiusX = 100.0
    radiusY = 50.0
    fill = Color.CORAL
}

線(Line)

線是相當直接的。 提供開始和結束坐標以繪制兩點之間的一條線。

line {
    startX = 50.0
    startY = 50.0
    endX = 150.0
    endY = 100.0
}

折線(Polyline)

Polyline由分段點數組(an array of segment points)定義。 PolylinePolygon類似,但不會自動關閉。

polyline(0.0, 0.0, 80.0, 40.0, 40.0, 80.0)

QuadCurve

Quadcurve表示(x,y)坐標空間中的二次Bézier參數曲線段(quadratic Bézier parametric curve segment)。 使用指定點(controlX, controlY) 作為Bézier控制點,繪制與指定坐標(startX, startY)和 (endX, endY)相交的曲線。

quadcurve {
    startX = 0.0
    startY = 150.0
    endX = 150.0
    endY = 150.0
    controlX = 75.0
    controlY = 0.0
    fill = Color.BURLYWOOD
}

SVGPath

SVGPath表示通過從String解析SVG路徑數據(SVG path data)構造的形狀。

svgpath("M70,50 L90,50 L120,90 L150,50 L170,50 L210,90 L180,120 L170,110 L170,200 L70,200 L70,110 L60,120 L30,90 L70,50") {
    stroke = Color.DARKGREY
    strokeWidth = 2.0
    effect = DropShadow()
}

路徑(Path)

Path代表一個形狀,并提供基本的構造和管理幾何路徑所需的設施。 換句話說,它可以幫助您創建自定義形狀。 以下幫助函數可用于構建路徑:

  • moveTo(x, y)
  • hlineTo(x)
  • vlineTo(y)
  • quadqurveTo(controlX, controlY, x, y)
  • lineTo(x, y)
  • arcTo(radiusX, radiusY, xAxisRotation, x, y, largeArcFlag, sweepFlag)
  • closepath()
path {
    moveTo(0.0, 0.0)
    hlineTo(70.0)
    quadqurveTo {
        x = 120.0
        y = 60.0
        controlX = 100.0
        controlY = 0.0
    }
    lineTo(175.0, 55.0)
    arcTo {
        x = 50.0
        y = 50.0
        radiusX = 50.0
        radiusY = 50.0
    }
}

動畫

JavaFX具有通過逐漸更改其一個或多個屬性來動畫化任何Node的工具。 在JavaFX中創建動畫有三個組件。

Timeline - 以指定順序執行的一系列KeyFrame

KeyFrame - 指定在一個或多個節點上的一個或多個可寫屬性(通過KeyValue)的值改變的(specifying value changes)“快照”

KeyValue - 將Node屬性與將被“轉換(transitioned)”到的值配對

KeyValue是JavaFX動畫的基本構建塊。 它指定一個屬性和“新值”,它將逐漸轉換到該新值。 所以如果你有一個Rectangle, 其rotateProperty()0.0,并且你指定一個KeyValue,將其改為90.0度,它會遞增地從0.0改變到90.0度。 將KeyValue放在KeyFrame,這可以指定這兩個值之間的動畫持續時間。 在這種情況下,我們讓它為5秒。 最后把這個KeyFrame放在一個Timeline 。 如果您運行下面的代碼,您將看到一個rectange在5秒鐘內從0.0逐漸旋轉到90.0度(圖9.1)。

val rectangle = rectangle(width = 60.0,height = 40.0) {
    padding = Insets(20.0)
}
timeline {
    keyframe(Duration.seconds(5.0)) {
        keyvalue(rectangle.rotateProperty(),90.0)
    }
}
圖9.1

在給定的KeyFrame,您可以同時處理該5秒窗口中的其他屬性。 例如,我們可以在Rectangle旋轉時轉換arcWidthProperty()arcHeightProperty() (圖9.2)。

timeline {
        keyframe(Duration.seconds(5.0)) {
            keyvalue(rectangle.rotateProperty(),90.0)
            keyvalue(rectangle.arcWidthProperty(),60.0)
            keyvalue(rectangle.arcHeightProperty(),60.0)
        }
}
圖9.2

插值(Interpolators)

您還可以指定一個可以為動畫添加微妙效果的Interpolator。 例如,您可以指定Interpolator.EASE_BOTH來優化動畫開始和結束時的值更改。

val rectangle = rectangle(width = 60.0, height = 40.0) {
    padding = Insets(20.0)
}

timeline {
    keyframe(5.seconds) {
        keyvalue(rectangle.rotateProperty(), 180.0, interpolator = Interpolator.EASE_BOTH)
    }
}

循環和自動反轉(Cycles and AutoReverse)

您可以修改timeline()其他屬性,如cycleCountautoReversecycleCount將重復動畫指定次數,且將isAutoReverse設置為true將導致每個循環返回。

timeline {
    keyframe(5.seconds) {
        keyvalue(rectangle.rotateProperty(), 180.0, interpolator = Interpolator.EASE_BOTH)
    }
    isAutoReverse = true
    cycleCount = 3
}

要無限期重復動畫,請將cycleCount設置為Timeline.INDEFINITE

速記動畫(Shorthand Animation)

如果要為單個屬性設置動畫,您可以快速地將其動畫化,而無需聲明timeline()keyframe()keyset()。 調用該interoplatoranimate()擴展函數,并提供endValueduration,以及可選的interoplator。 如果您只是一個屬性動畫,這會更短,更干凈。

rectangle.rotateProperty().animate(endValue = 180.0, duration = 5.seconds)

總結

在本章中,我們介紹了形狀和動畫的構造器。 我們沒有覆蓋JavaFX的Canvas因為這超出了TornadoFX框架的范圍。 它可以容易地占用多個章節。 但是,形狀和動畫應該能允許您為大多數任務執行基本的自定義圖形。

現在,我們對TornadoFX構建器的覆蓋范圍到此結束。 接下來,我們將為那些需要使用它的人介紹FXML。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • Animation Animation類是所有動畫(scale、alpha、translate、rotate)的基...
    四月一號閱讀 1,933評論 0 10
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,823評論 18 139
  • 先看看CAAnimation動畫的繼承結構 CAAnimation{ CAPropertyAnimation { ...
    時間不會倒著走閱讀 1,674評論 0 1
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 1,787評論 0 2
  • 最近項目中有需求對存有 ARGB8888 數據的 Bitmap 進行基于原值的透明度(alpha 值)調整,要對每...
    硬耳geeklok閱讀 498評論 0 0