一、要来讨论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表达式啦!后期有机会单独出一篇吧。
由于是第一次写博客,不足之处还望大家谅解,ღ( ´・ᴗ・` )比心