一、要來討論PathTransition,那就需要先來看看它的父類(Animation)都有哪些屬性值和方法
| javafx.animation.Animation -UML |
| -autoReverse: BooleanProperty |
| -cycleCount: IntegerProperty |
| -rate: DoubleProperty |
| -status: ReadOnlyObjectProperty<Animation.Status> |
| +pause(): void |
| +play(): void |
| +stop(): void |
autoReverse是一個Boolean屬性,表示下一周期動畫是否要倒轉方向。cycleCount表示該動畫循環次數,一般可以用Timeline.INDEFINTE 來表示無限循環。rate定義了動畫的速度,可以用。一個負的rate表示動畫的相反方向。status是只讀屬性,表明了動畫的狀態(Animation.Status.PAUSE、Animation.Status.RUNNING和Animation.Status.STOPPED)。方法pause()、play()、stop()表示暫停、播放和終止動畫。
二、PathTransition的屬性值和方法
| javafx.animation.PathTransition -UML |
| -duration: ObjectProperty<Dutation> |
| -node: objectProperty<Node> |
| -orientation: ObjectProperty<PathTransition.OrientationType> |
| -path: ObjectType<Shape> |
| +PathTransition() |
| +PathTransition(duration: Duration, path: Shape) |
| +PathTransition(duration: Duration, path: Shape, node: Node) |
Duration類定義了持續時間。它是一個不可更改的類。這個類定義了常量INDEFINTE、ONE、UNKNOWN和ZERO來代表一個無限循環、1毫秒、未知以及0的持續時間。可以使用new Duration(double millis)來創建一個Duration實例,可以使用add、subtract、multiply和divide方法來執行算術操作,還可以使用toHours()、toMinutes()、toSeconds()和toMillis()來返回持續時間值中的小數數、分鍾數、秒鍾數以及毫秒數。還可以使用compareTo來比較兩個持續時間。
常量NONE和ORTHOGONAL_TO_TANGET在PathTransition.OrientationType中定義。后者確定結點沿着幾何路徑移動的過程中是否和路徑的切線保持垂直。
三、口述總是難以理解,下面給出一個教材上的實例供大家分析
PathTransitionDemo.java
1 import javafx.scene.Scene; 2 import javafx.application.Application; 3 import javafx.stage.Stage; 4 import javafx.scene.layout.*; 5 import javafx.scene.paint.*; 6 import javafx.scene.shape.*; 7 import javafx.animation.Timeline; 8 import javafx.animation.PathTransition; 9 import javafx.scene.input.MouseEvent; 10 import javafx.util.Duration; 11 12 public class PathTransitionDemo extends Application{ 13 public void start(Stage primaryStage) { 14 15 Scene scene = new Scene(new getPathTransitionPane(),250,200); 16 primaryStage.setScene(scene); 17 primaryStage.setTitle("JAVAFX!"); 18 primaryStage.show(); 19 } 20 public static void main(String[] args) { 21 // TODO Auto-generated method stub 22 launch(args); 23 } 24 25 } 26 27 class getPathTransitionPane extends Pane{ 28 private void paint() { 29 this.getChildren().clear(); 30 Circle circlePath = new Circle(getWidth()/2,getHeight()/2,getWidth()/4<getHeight()/4 31 ? getWidth()/4 : getHeight()/4); 32 // Circle circlePath = new Circle(125,100,50); 33 circlePath.setFill(Color.WHITE); 34 circlePath.setStroke(Color.BLUE); 35 Rectangle reNode = new Rectangle(circlePath.getRadius(),circlePath.getRadius()/2); 36 reNode.setFill(Color.ORANGE); 37 getChildren().addAll(circlePath,reNode); 38 39 PathTransition pathTransition = new PathTransition(Duration.millis(4000),circlePath,reNode); 40 pathTransition.setOrientation(PathTransition.OrientationType.ORTHOGONAL_TO_TANGENT); 41 pathTransition.setCycleCount(Timeline.INDEFINITE); 42 pathTransition.setAutoReverse(true); 43 pathTransition.play(); 44 45 reNode.setOnMousePressed(e -> pathTransition.pause()); 46 reNode.setOnMouseReleased(e -> pathTransition.play()); 47 } 48 @Override 49 public void setWidth(double width) { 50 super.setWidth(width); 51 paint(); 52 } 53 public void setHeight(double Height) { 54 super.setHeight(Height); 55 paint(); 56 } 57 }
如果你自己有教材的話你可能會問“你這個哪里和教材一樣,胡說!” 朋友,不要着急嘛!我還沒講完嘞。如過你沒有教材的話,那就更不用擔心啦!PS:本次的隨筆部分資料出自:Java語言程序設計(基礎篇) 梁勇著
教材中所給出的是代碼都是在start方法內完成了所有的事情,而我希望能完成一個“假綁定”,所以采用了外部類的表現形式。如果你上機把上面的代碼運行一邊,你就會知道啦~代碼中給出陰影的部分是PathTransition的一些設置,相信其他的知識你都有所了解吧,這里我就不解釋lambda表達式啦!后期有機會單獨出一篇吧。
由於是第一次寫博客,不足之處還望大家諒解,ღ( ´・ᴗ・` )比心
