当前位置: 首页 > 面试题库 >

JavaFX-水平字幕文本

岳时铭
2023-03-14
问题内容

我正在尝试实现类似于字幕的效果-
长行(在我的情况下)的行在水平轴上移动。我设法使它起作用,但我不能称其令人满意。

我的Controller课如下:

@FXML
private Text newsFeedText;

(...)
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    TranslateTransition transition = TranslateTransitionBuilder.create()
            .duration(new Duration(7500))
            .node(newsFeedText)
            .interpolator(Interpolator.LINEAR)
            .cycleCount(Timeline.INDEFINITE)
            .build();

    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    int width = gd.getDisplayMode().getWidth();

    transition.setFromX(width);
    transition.setToX(-width);
    transition.play();
}

newsFeedText 绑定到动态更新的某些文本源,因此其中包含各种文本。

我的代码至少有两个缺点:

  • 过渡从-width+width; width是显示器的分辨率宽度

如果窗口未全屏显示,则有时文本根本不可见。如果文本较长且newsFeedText宽度大于监视器的分辨率宽度,则过渡将消失“一半”(仍在屏幕上)。

  • 目前Duration不依赖于的宽度newsFeedText

现在,这没什么大不了的,但是如果对转折fromXtoX进行动态计算,那么它将导致各种字幕的速度。

如何摆脱这些弊端?


问题答案:

我设法使其正常工作,只有在过渡停止后才能进行任何重新计算,因此我们无法将其设置cycleCountTimeline.INDEFINITE。我的要求是我可以更改组件内部的文本,所以有fxml接线:

@FXML
private Text node; // text to marquee

@FXML
private Pane parentPane; // pane on which text is placed

起作用的代码是:

transition = TranslateTransitionBuilder.create()
        .duration(new Duration(10))
        .node(node)
        .interpolator(Interpolator.LINEAR)
        .cycleCount(1)
        .build();

transition.setOnFinished(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent actionEvent) {
        rerunAnimation();
    }
});

rerunAnimation();

在哪里rerunAnimation()

private void rerunAnimation() {
    transition.stop();
    // if needed set different text on "node"
    recalculateTransition();
    transition.playFromStart();
}

并且recalculateTransition()是:

private void recalculateTransition() {
    transition.setToX(node.getBoundsInLocal().getMaxX() * -1 - 100);
    transition.setFromX(parentPane.widthProperty().get() + 100);

    double distance = parentPane.widthProperty().get() + 2 * node.getBoundsInLocal().getMaxX();
    transition.setDuration(new Duration(distance / SPEED_FACTOR));
}


 类似资料:
  • 我可以在JavaFX中创建一个仅水平滚动的滚动窗格,如下所示: 但是,鼠标滚轮在这种情况下仍然尝试垂直滚动而不是水平滚动(除非我专门在水平滚动条上滚动。)

  • 条形图的代码如下: 我有一个字符串列表:lst = ['A ',' B ',' C ',' D ',' E ',' F ',' G ',' H ',' I ',' J'] 我想用以下字符串注释我的柱线(列表的第一个元素=第一根柱线的注释)。 当然,它会用值A标注所有的条形,位置不在条形图内。 有什么办法可以解决这个问题吗?

  • Sometimes you just want to write some text on top of an image. The following examples demonstrate using some of the text functions included with watermark.js. In the interest of saving space, the foll

  • 实现水平方向的UITableView,即将TableView做90度的旋转。可以作为scrollView使用。注意,往表里添加内容的时候,一定要把cell也进行一定角度的旋转,不然内容会出现倒置的。 [Code4App.com]

  • 我使用绘制图表。我有另一个要求,我需要显示两个图表水平。 我有什么办法可以把这两张图表做成单行吗? 编辑:实际上,我希望它像您的示例一样。为此,您使用了,但这里我使用的是。