TornadoFX編程指南糕非,第9章蒙具,形狀和動畫

譯自《Shapes and Animation

形狀和動畫

JavaFX帶有幾乎表示任何幾何形狀的節(jié)點球榆,以及一個Path節(jié)點朽肥,它提供組裝和管理幾何路徑所需的工具(以創(chuàng)建自定義形狀)。 JavaFX還具有動畫支持持钉,逐漸改變Node屬性衡招,創(chuàng)建兩個狀態(tài)之間的視覺轉(zhuǎn)換。 TornadoFX旨在通過構(gòu)建器構(gòu)造來簡化所有這些功能每强。

形狀基礎(chǔ)(Shape Basics)

形狀構(gòu)建器的每個參數(shù)都是可選的始腾,在大多數(shù)情況下,默認值為0.0 空执。 這意味著您只需要提供您關(guān)心的參數(shù)浪箭。 構(gòu)建器具有每個形狀的大多數(shù)屬性的位置參數(shù),其余的可以設置在隨后的函數(shù)塊中辨绊。 因此奶栖,這些都是創(chuàng)建矩形的有效方式:

rectangle {
    width = 100.0
    height = 100.0
}

rectangle(width = 100.0, height = 100.0)

rectangle(0.0, 0.0, 100.0, 100.0)

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

在父項內(nèi)定位

大多數(shù)形狀構(gòu)建器可以讓您選擇在父項中指定形狀的位置冻晤。 這是否有任何影響取決于父節(jié)點苇羡。 除非您在形狀上調(diào)用setManaged(false),否則HBox不會關(guān)心您指定的xy坐標鼻弧。 但是设江,Group控件將會關(guān)心這一點。 以下示例中的截圖將通過在一個Group周圍包裝一個StackPane攘轩,并最后在該Group內(nèi)創(chuàng)建形狀绣硝,如下所示。

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)坐標空間中的立方貝塞爾參數(shù)曲線段(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表示具有指定大小和位置參數(shù)的橢圓浴韭。

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

線(Line)

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

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

折線(Polyline)

Polyline由分段點數(shù)組(an array of segment points)定義念颈。 PolylinePolygon類似泉粉,但不會自動關(guān)閉。

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

QuadCurve

Quadcurve表示(x,y)坐標空間中的二次Bézier參數(shù)曲線段(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路徑數(shù)據(jù)(SVG path data)構(gòu)造的形狀窟感。

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代表一個形狀讨彼,并提供基本的構(gòu)造和管理幾何路徑所需的設施。 換句話說柿祈,它可以幫助您創(chuàng)建自定義形狀哈误。 以下幫助函數(shù)可用于構(gòu)建路徑:

  • 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中創(chuàng)建動畫有三個組件。

Timeline - 以指定順序執(zhí)行的一系列KeyFrame

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

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

KeyValue是JavaFX動畫的基本構(gòu)建塊黑滴。 它指定一個屬性和“新值”憨募,它將逐漸轉(zhuǎn)換到該新值。 所以如果你有一個Rectangle袁辈, 其rotateProperty()0.0菜谣,并且你指定一個KeyValue,將其改為90.0度晚缩,它會遞增地從0.0改變到90.0度尾膊。 將KeyValue放在KeyFrame,這可以指定這兩個值之間的動畫持續(xù)時間荞彼。 在這種情況下冈敛,我們讓它為5秒。 最后把這個KeyFrame放在一個Timeline 鸣皂。 如果您運行下面的代碼抓谴,您將看到一個rectange在5秒鐘內(nèi)從0.0逐漸旋轉(zhuǎn)到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旋轉(zhuǎn)時轉(zhuǎn)換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來優(yōu)化動畫開始和結(jié)束時的值更改被啼。

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)
    }
}

循環(huán)和自動反轉(zhuǎn)(Cycles and AutoReverse)

您可以修改timeline()其他屬性帜消,如cycleCountautoReversecycleCount將重復動畫指定次數(shù)浓体,且將isAutoReverse設置為true將導致每個循環(huán)返回泡挺。

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()。 調(diào)用該interoplatoranimate()擴展函數(shù)勘伺,并提供endValue跪腹, duration,以及可選的interoplator飞醉。 如果您只是一個屬性動畫冲茸,這會更短屯阀,更干凈。

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

總結(jié)

在本章中轴术,我們介紹了形狀和動畫的構(gòu)造器难衰。 我們沒有覆蓋JavaFX的Canvas因為這超出了TornadoFX框架的范圍。 它可以容易地占用多個章節(jié)逗栽。 但是盖袭,形狀和動畫應該能允許您為大多數(shù)任務執(zhí)行基本的自定義圖形。

現(xiàn)在彼宠,我們對TornadoFX構(gòu)建器的覆蓋范圍到此結(jié)束鳄虱。 接下來,我們將為那些需要使用它的人介紹FXML凭峡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拙已,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子摧冀,更是在濱河造成了極大的恐慌倍踪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件索昂,死亡現(xiàn)場離奇詭異惭适,居然都是意外死亡,警方通過查閱死者的電腦和手機楼镐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門癞志,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人框产,你說我怎么就攤上這事凄杯。” “怎么了秉宿?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵戒突,是天一觀的道長。 經(jīng)常有香客問我描睦,道長膊存,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任忱叭,我火速辦了婚禮隔崎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘韵丑。我一直安慰自己爵卒,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布撵彻。 她就那樣靜靜地躺著钓株,像睡著了一般实牡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轴合,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天创坞,我揣著相機與錄音,去河邊找鬼受葛。 笑死题涨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奔坟。 我是一名探鬼主播携栋,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咳秉!你這毒婦竟也來了婉支?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤澜建,失蹤者是張志新(化名)和其女友劉穎向挖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炕舵,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡何之,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咽筋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溶推。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奸攻,靈堂內(nèi)的尸體忽然破棺而出蒜危,到底是詐尸還是另有隱情,我是刑警寧澤睹耐,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布辐赞,位于F島的核電站,受9級特大地震影響硝训,放射性物質(zhì)發(fā)生泄漏响委。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一窖梁、第九天 我趴在偏房一處隱蔽的房頂上張望赘风。 院中可真熱鬧,春花似錦窄绒、人聲如沸贝次。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛔翅。三九已至,卻和暖如春位谋,著一層夾襖步出監(jiān)牢的瞬間山析,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工掏父, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笋轨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓赊淑,卻偏偏與公主長得像爵政,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陶缺,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Animation Animation類是所有動畫(scale钾挟、alpha、translate饱岸、rotate)的基...
    四月一號閱讀 1,915評論 0 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理掺出,服務發(fā)現(xiàn),斷路器苫费,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 先看看CAAnimation動畫的繼承結(jié)構(gòu) CAAnimation{ CAPropertyAnimation { ...
    時間不會倒著走閱讀 1,649評論 0 1
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color汤锨,font,text-align百框,li...
    wzhiq896閱讀 1,749評論 0 2
  • 最近項目中有需求對存有 ARGB8888 數(shù)據(jù)的 Bitmap 進行基于原值的透明度(alpha 值)調(diào)整闲礼,要對每...
    硬耳geeklok閱讀 482評論 0 0