如何在javafx中滑动(translatetransition)listview

时间:2016-11-26 17:46:33

标签: listview animation javafx

我有一个自定义fxml视图的列表视图。一切都好。现在我想像幻灯片放映一样自动显示我的所有项目。我尝试在列表视图上使用translatetransition。它做我想要的但问题是当listview包含更多项目并需要滚动时,它只翻译1或2个项目,通常显示为listview而不滚动。 表示我只能翻译listview默认视图区域,但其他需要滚动的项目不会显示。

  

我的翻译代码如下:

    t = new TranslateTransition(Duration.seconds(10), listView);
    t.setToY(-(Screen.getPrimary().getVisualBounds().getHeight() + 500));
    t.setAutoReverse(true);
    t.setCycleCount(TranslateTransition.INDEFINITE);
    t.play();

1 个答案:

答案 0 :(得分:1)

当然它没有显示所有项目。屏幕上显示的ListCell没有多少{+可能有一些距离视口足够近。)

通常只显示一个单元格,您可以调用scrollTo方法。但是,如果要控制滚动速度,则不能选择此选项。

您需要调整可以访问ScrollBar的滚动位置,并使用Timeline动画来更改其值:

@Override
public void start(Stage primaryStage) {
    ListView<Integer> listView = new ListView<>();

    for (int i = 0; i < 100; i++) {
        listView.getItems().add(i);
    }

    Button btn = new Button("start/stop scrolling");

    Scene scene = new Scene(new VBox(listView, btn));

    // make sure skin is created
    listView.applyCss();
    listView.layout();

    // assuming vertical listview here
    ScrollBar scrollBar = (ScrollBar) listView.lookup(".scroll-bar:"+listView.getOrientation().toString().toLowerCase());

    DoubleProperty pos = new SimpleDoubleProperty();
    DoubleBinding scrollValueBinding
            = scrollBar.maxProperty().subtract(scrollBar.minProperty()).multiply(pos).add(scrollBar.minProperty());

    Timeline timeline = new Timeline(
            new KeyFrame(Duration.ZERO, new KeyValue(pos, 0d)),
            new KeyFrame(Duration.seconds(5), new KeyValue(pos, 1d))
    );

    scrollBar.visibleProperty().addListener((observable, wasVisible, isVisible) -> {
        if (!isVisible) {
            // stop when scrollbar disappears
            timeline.pause();
        }
    });
    timeline.statusProperty().addListener((observable, oldStatus, newStatus) -> {
        if (newStatus == Animation.Status.RUNNING) {
            scrollBar.setDisable(true);
            scrollBar.valueProperty().bind(scrollValueBinding);
        } else if (oldStatus == Animation.Status.RUNNING) {
            scrollBar.setDisable(false);
            scrollBar.valueProperty().unbind();
        }
    });

    timeline.setAutoReverse(true);
    timeline.setCycleCount(Animation.INDEFINITE);

    btn.setOnAction(evt -> {
        if (timeline.getStatus() == Animation.Status.RUNNING || !scrollBar.isVisible()) {
            timeline.pause();
        } else {
            // only run if not already running and scrollbar is visible
            Duration total = timeline.getCycleDuration();
            timeline.playFrom(total.multiply((scrollBar.getValue() - scrollBar.getMin()) / (scrollBar.getMax() - scrollBar.getMin())));
        }
    });

    primaryStage.setScene(scene);
    primaryStage.show();
}