如何使用浅色为JavaFX背景渐变设置动画

时间:2018-06-01 11:57:36

标签: javafx concurrency

我正在寻找浅色背景渐变动画的解决方案。我已经查看了KeyFrames的其他示例,但我自己无法做到这一点。

所以我制作了我需要的原始版本:

boolean rbottomforward = true;
boolean gbottomforward = true;
boolean bbottomforward = true;
int redbottom = 171;
int greenbottom = 186;
int bluebottom = 171;

boolean rtopforward = true;
boolean gtopforward = true;
boolean btopforward = true;
int redtop = 255;
int greentop = 255;
int bluetop = 255;

@Override
protected Void call() throws Exception {
    Timeline backgroundAnimator = new Timeline(new KeyFrame(Duration.millis(200), event -> {
        backgroundPane.getStylesheets().clear();
        backgroundPane.setStyle("-fx-background-color: linear-gradient(to top, "+ randomBottomColor()+", "+randomTopColor()+");");

    }));
    backgroundAnimator.setCycleCount(Timeline.INDEFINITE);
    backgroundAnimator.play();
    return null;
}

private String randomBottomColor() {
    greenbottom = newBottomGreen();
    redbottom = newBottomRed();
    bluebottom = newBottomBlue();
    return String.format("rgb(%d,%d,%d)", redbottom, greenbottom, bluebottom);
}

private int newBottomGreen() {
    if(greenbottom <255 && greenbottom >155){
        if(gbottomforward)
greenbottom +=getRandomNumber();
        else
greenbottom -=getRandomNumber();
    } else if(greenbottom >=255) {
        gbottomforward=false;
        greenbottom -=getRandomNumber();
    } else {
        gbottomforward=true;
        greenbottom +=getRandomNumber();
    }
    return greenbottom;
}

private int getRandomNumber() {
    int r = (int) (Math.random() * (3 - 1)) + 1;
    return r;
}

private int newBottomRed() {
    if(redbottom <255 && redbottom >155){
        if(rbottomforward)
redbottom +=getRandomNumber();
        else
redbottom -=getRandomNumber();
    } else if(redbottom >=255) {
        rbottomforward=false;
        redbottom -=getRandomNumber();
    } else {
        rbottomforward=true;
        redbottom +=getRandomNumber();
    }
    return redbottom;
}

private int newBottomBlue() {
    if(bluebottom <255 && bluebottom >155){
        if(bbottomforward)
bluebottom +=getRandomNumber();
        else
bluebottom -=getRandomNumber();
    } else if(bluebottom >=255) {
        bbottomforward=false;
        bluebottom -=getRandomNumber();
    } else{
        bbottomforward=true;
        bluebottom +=getRandomNumber();
    }
    return bluebottom;
}
private String randomTopColor() {
    greentop = newTopGreen();
    redtop = newTopRed();
    bluetop = newTopBlue();
    return String.format("rgb(%d,%d,%d)", redtop, greentop, bluetop);
}

private int newTopGreen() {
    if(greentop <255 && greentop >155){
        if(gtopforward)
greentop +=getRandomNumber();
        else
greentop -=getRandomNumber();
    } else if(greentop >=255) {
        gtopforward=false;
        greentop -=getRandomNumber();
    } else {
        gtopforward=true;
        greentop +=getRandomNumber();
    }
    return greentop;
}

private int newTopRed() {
    if(redtop <255 && redtop >155){
        if(rtopforward)
redtop +=getRandomNumber();
        else
redtop -=getRandomNumber();
    } else if(redtop >=255) {
        rtopforward=false;
        redtop -=getRandomNumber();
    } else {
        rtopforward=true;
        redtop +=getRandomNumber();
    }
    return redtop;
}

private int newTopBlue() {
    if(bluetop <255 && bluetop >155){
        if(btopforward)
bluetop +=getRandomNumber();
        else
bluetop -=getRandomNumber();
    } else if(bluetop >=255) {
        btopforward=false;
        bluetop -=getRandomNumber();
    } else{
        btopforward=true;
        bluetop +=getRandomNumber();
    }
    return bluetop;
}

这有点矫枉过正。任何人都可以帮助我将其转换为更高级的代码。谢谢:))

1 个答案:

答案 0 :(得分:1)

关于这一点你真的没什么可做的,但减少了代码中的重复。 (您将无法插入任何内容,因为在每次更新时,都会随机选择下一种颜色。)

您应该对所有颜色通道使用相同的代码:

Task<Void>

此代码并不比您的代码短得多,但它更容易维护。如果要修改更新通道的逻辑,只需调整1个方法而不是6个方法。此外,它还减轻了JavaFX在每次更新时解析内联CSS的负担。

注意:

您似乎正在扩展Timeline.play或类似的并发相关类。这不是必需的,因为EventHandler<ActionEvent>不是长时间运行的操作,而是在稍后的时间触发应用程序线程上的逻辑(在本例中为tableCars ------- car color --------------- Mercedes blue Mercedes red Mercedes white BMW blue BMW red BMW white AUDI red AUDI white tableColors ------- color ------- blue red white )的重复执行。