JavaFX歌词滚动

代码
package com.wgj.music.test;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.*;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.transform.Shear;
import javafx.scene.transform.Transform;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Duration;
public class GC extends Application {
SimpleDoubleProperty winWidth = new SimpleDoubleProperty();
SimpleDoubleProperty winHeight = new SimpleDoubleProperty();
SimpleIntegerProperty simple_Index = new SimpleIntegerProperty(-1);
SimpleDoubleProperty shear_x = new SimpleDoubleProperty();
SimpleDoubleProperty shear_y = new SimpleDoubleProperty();
SimpleDoubleProperty opacity = new SimpleDoubleProperty();
LinearGradient linearGradient = null;
VBox ui =null;
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setAlwaysOnTop(true);
AnchorPane root= new AnchorPane();
ui = ui();
ui.setPadding(new Insets(20));
simple_Index.addListener((observable, oldValue, newValue) -> {
StackPane nodo_1 = (StackPane) ui.getChildren().get(simple_Index.get());
nodo_1.getChildren().forEach(item -> {
Transform first = item.getTransforms().getFirst();
shear_x.set(((Shear) first).getX());
shear_y.set(((Shear) first).getY());
opacity.set(item.getOpacity());
item.getTransforms().removeFirst();
item.getTransforms().add(Transform.shear(0, 0));
item.setOpacity(1);
});
Stop stop1 = new Stop(0, Color.valueOf("#edc1cd"));
Stop stop2 = new Stop(0.5, Color.valueOf("#ffccf3"));
Stop stop3 = new Stop(1, Color.valueOf("#f9bbed"));
Text first = (Text) nodo_1.getChildren().getFirst();
linearGradient = (LinearGradient) first.getFill();
first.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT,stop1, stop2, stop3));
((Text) nodo_1.getChildren().getLast()).setFill(Color.RED);
});
simple_Index.set(0);
StackPane stack_Bind = (StackPane)(ui.getChildren().getFirst());
stack_Bind.widthProperty().addListener((observable, oldValue, newValue) -> {
winWidth.set(newValue.doubleValue());
winHeight.set(stack_Bind.prefHeight(-1));
callback();
});
SubScene subScene = new SubScene(root,1000,1000,true,SceneAntialiasing.BALANCED);
PerspectiveCamera perspectiveCamera = new PerspectiveCamera();
perspectiveCamera.setTranslateY(-100);
perspectiveCamera.setTranslateX(-100);
subScene.setCamera(perspectiveCamera);
ui.setTranslateZ(1000);
ui.setTranslateY(100);
ui.setTranslateX(100);
subScene.setRoot(ui);
root.getChildren().addAll(subScene);
Scene scene = new Scene(root);
scene.setFill(Color.TRANSPARENT);
primaryStage.setScene(scene);
primaryStage.initStyle(StageStyle.TRANSPARENT);
primaryStage.show();
}
public void callback(){
StackPane stack_Item = (StackPane) ui.getChildren().get(simple_Index.get());
Rectangle rectangle = new Rectangle(0, 0, 0,winHeight.get());
stack_Item.getChildren().getLast().setClip(rectangle);
Timeline timeline = new Timeline();
timeline.setOnFinished(event -> {
stack_Item.getChildren().removeLast();
Node first = stack_Item.getChildren().getFirst();
first.setOpacity(opacity.doubleValue());
first.getTransforms().add(Transform.shear(shear_x.get(),shear_y.get()));
((Text)first).setFill(linearGradient);
if (simple_Index.get()==8){
simple_Index.set(0);
ui = ui();
}
simple_Index.set(simple_Index.get() + 1);
callback();
});
KeyFrame keyFrame = new KeyFrame(Duration.seconds(0), new KeyValue(rectangle.widthProperty(), 0));
timeline.getKeyFrames().add(keyFrame);
KeyFrame keyFrame1 = new KeyFrame(Duration.seconds(10), new KeyValue(rectangle.widthProperty(), winWidth.get()));
timeline.getKeyFrames().add(keyFrame1);
timeline.setDelay(Duration.ZERO);
timeline.play();
}
public Text item(String textStr,double dept){
Text text = new Text(textStr);
text.setTextOrigin(VPos.TOP);
text.setFont(Font.font(18));
return text;
}
public VBox ui(){
VBox ui = new VBox(10);
ui.setAlignment(Pos.CENTER);
StackPane li_stack_1 = new StackPane();
Text h1_1 = createText_h1();
Text h1_2 = createText_h1();
li_stack_1.getChildren().addAll(h1_1,h1_2);
StackPane li_stack_2 = new StackPane();
Text h2_1 = createText_h2();
Text h2_2 = createText_h2();
li_stack_2.getChildren().addAll(h2_1,h2_2);
StackPane li_stack_3 = new StackPane();
Text h3_1 = createText_h3();
Text h3_2 = createText_h3();
li_stack_3.getChildren().addAll(h3_1,h3_2);
StackPane li_stack_4 = new StackPane();
Text h4_1 = createText_h4();
Text h4_2 = createText_h4();
li_stack_4.getChildren().addAll(h4_1,h4_2);
StackPane li_stack_5 = new StackPane();
Text h5_1 = createText_h5();
Text h5_2 = createText_h5();
li_stack_5.getChildren().addAll(h5_1,h5_2);
StackPane li_stack_6 = new StackPane();
Text h6_1 = createText_h6();
Text h6_2 = createText_h6();
li_stack_6.getChildren().addAll(h6_1,h6_2);
StackPane li_stack_7 = new StackPane();
Text h7_1 = createText_h7();
Text h7_2 = createText_h7();
li_stack_7.getChildren().addAll(h7_1,h7_2);
StackPane li_stack_8 = new StackPane();
Text h8_1 = createText_h8();
Text h8_2 = createText_h8();
li_stack_8.getChildren().addAll(h8_1,h8_2);
StackPane li_stack_9 = new StackPane();
Text h9_1 = createText_h9();
Text h9_2 = createText_h9();
li_stack_9.getChildren().addAll(h9_1,h9_2);
ui.getChildren().addAll(li_stack_1,li_stack_2,li_stack_3,li_stack_4,li_stack_5,li_stack_6,li_stack_7,li_stack_8,li_stack_9);
return ui;
}
public Text createText_h1(){
Text 何必要那么多的借口 = item("何必要那么多的借口", 0.6);
何必要那么多的借口.getTransforms().add(Transform.shear(0,0.01));
何必要那么多的借口.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#ecc3c1")), new Stop(0.5, Color.valueOf("#ceb4c2")), new Stop(1, Color.valueOf("#f2d9dd"))));
何必要那么多的借口.setOpacity(0.8);
return 何必要那么多的借口;
}
public Text createText_h2(){
Text 让我内疚自己还爱的不够 = item("让我内疚自己还爱的不够", 0.7);
让我内疚自己还爱的不够.getTransforms().add(Transform.shear(0,0.01));
让我内疚自己还爱的不够.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#ecc3c1")), new Stop(0.5, Color.valueOf("#ceb4c2")), new Stop(1, Color.valueOf("#f2d9dd"))));
return 让我内疚自己还爱的不够;
}
public Text createText_h3() {
Text 预谋了很久不过是想分手 = item("预谋了很久不过是想分手", 0.8);
预谋了很久不过是想分手.getTransforms().add(Transform.shear(0, 0.01));
预谋了很久不过是想分手.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#f4e3db")), new Stop(0.5, Color.valueOf("#e0c6cf")), new Stop(1, Color.valueOf("#eed4e1"))));
return 预谋了很久不过是想分手;
}
public Text createText_h4() {
Text 何不直截了当的说出口 = item("何不直截了当的说出口", 0.9);
何不直截了当的说出口.getTransforms().add(Transform.shear(0,0.01));
何不直截了当的说出口.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#f4e3db")), new Stop(0.5, Color.valueOf("#d0b1c0")), new Stop(1, Color.valueOf("#cab3ba"))));
return 何不直截了当的说出口;
}
public Text createText_h5() {
Text 既然你非要你的自由 = item("既然你非要你的自由", 1);
既然你非要你的自由.getTransforms().add(Transform.shear(0,0));
既然你非要你的自由.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#f4e3db")), new Stop(0.5, Color.valueOf("#d0b1c0")), new Stop(1, Color.valueOf("#cab3ba"))));
return 既然你非要你的自由;
}
public Text createText_h6() {
Text 挽留也会让我委屈到最后 = item("挽留也会让我委屈到最后", 0.9);
挽留也会让我委屈到最后.getTransforms().add(Transform.shear(0,0));
挽留也会让我委屈到最后.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#f4e3db")), new Stop(0.5, Color.valueOf("#d0b1c0")), new Stop(1, Color.valueOf("#cab3ba"))));
return 挽留也会让我委屈到最后;
}
public Text createText_h7() {
Text 煎熬了这么久 = item("煎熬了这么久", 0.8);
煎熬了这么久.getTransforms().add(Transform.shear(0,0));
煎熬了这么久.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#f4e3db")), new Stop(0.5, Color.valueOf("#e0c6cf")), new Stop(1, Color.valueOf("#eed4e1"))));
return 煎熬了这么久;
}
public Text createText_h8() {
Text 已没有继续的理由 = item("已没有继续的理由", 0.7);
已没有继续的理由.getTransforms().add(Transform.shear(0,0));
已没有继续的理由.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#ecc3c1")), new Stop(0.5, Color.valueOf("#ceb4c2")), new Stop(1, Color.valueOf("#f2d9dd"))));
return 已没有继续的理由;
}
public Text createText_h9() {
Text 反正他都不难受他只要自由 = item("反正他都不难受他只要自由", 0.6);
反正他都不难受他只要自由.setFill(new LinearGradient(0, 0, 0, 1, true, CycleMethod.REPEAT, new Stop(0, Color.valueOf("#ecc3c1")), new Stop(0.5, Color.valueOf("#ceb4c2")), new Stop(1, Color.valueOf("#f2d9dd"))));
反正他都不难受他只要自由.setOpacity(0.8);
反正他都不难受他只要自由.getTransforms().add(Transform.shear(0,0));
return 反正他都不难受他只要自由;
}
}