JavaFX歌词滚动

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 反正他都不难受他只要自由;
    }





}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值