【发布时间】:2018-01-28 18:04:46
【问题描述】:
我正在尝试使用嵌套的 VBox 实现 JavaFX ScrollPane,但在移动设备中滚动速度过快时遇到了一个奇怪的问题。问题是,如果我以较小但快速的向上手势滚动,滚动窗格首先会停顿半秒,然后继续。它在随机滑动手势中变得迟钝。无论如何我可以优化这个吗?
这不会发生在桌面版本上,所以我猜这可能是我的手机和 JavaFX 本身的限制。 当我为滚动窗格视口设置背景图像时,这个问题更加明显。这是视图的一些示例代码:
public class StackUserView extends View {
private Label label;
public StackUserView(String name) {
super(name);
initDisplay();
}
private void initDisplay() {
this.label = new Label("10");
label.setFont(Font.font(40d));
VBox box = new VBox();
box.setSpacing(10);
box.setAlignment(Pos.CENTER_RIGHT);
for(int i = 0; i < 100; i++){
Label label = new Label("HELLO");
label.setCache(true);
label.setCacheHint(CacheHint.SPEED);
label.setCacheShape(true);
box.getChildren().add(label);
}
ScrollPane pane = new ScrollPane(box);
pane.setCacheHint(CacheHint.QUALITY);
pane.setFitToHeight(true);
pane.setFitToHeight(true);
this.setCenter(pane);
}
@Override
protected void updateAppBar(AppBar appBar) {
appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> MobileApplication.getInstance().showLayer(SpeedSelect.MENU_LAYER)));
appBar.setTitleText(this.getName());
appBar.getActionItems().add(MaterialDesignIcon.SEARCH.button(e -> System.out.println("Search")));
}
}
最终,我试图让它滚动尽可能接近实际的原生移动环境。
我已经能够优化需要滚动的情况,创建一个以 HBox 作为单元格的自定义 CharmListView,但是我不能将 SceneBuilder 用于我的视图,这会影响可维护性。
注意:我正在使用 LG G5 进行测试。
这是有关该问题的简短视频。刷完之后就可以看到了。滚动停止一秒钟,然后继续:
【问题讨论】:
-
我还没有测试过你的代码,但是为什么你说你不能在 Scene Builder 中使用 CharmListView 呢?到目前为止,ListView/CharmListView 控件精确地用于虚拟化和仅几个单元格的重用。而且,在移动端,CharmListView 实际上是一个优化的 ListView。
-
我当然可以在SceneBuilder中添加CharmListView,但是如何在SceneBuilder中添加HBox呢?对于此应用程序中的其他情况,我实际上已采用硬编码扩展 CharmListView 的 HBox 列表视图。但是,此应用程序中的大多数视图都是使用带有 FXML 注入的 SceneBuilder 完成的,因此我想限制生成视图所需的硬编码量。这不是一个很长的清单。只是足够长,无法适应视图。上面的代码 sn-p 只是重新创建问题的一些示例代码。不是实际代码。
-
这也不是一个真正的列表。它只是一个很长的表单,可能会根据查看它的设备的大小而溢出。
-
与常规 ListView 一样,CharmListView 使用 ListCell 实现。它们都不支持 Scene Builder 中的单元格。所以那里无法实现。但如果它也不适合作为列表,那么您确实需要另一个解决方案。
-
我猜你受到this bug的影响。可悲的是,似乎没有人对修复它太感兴趣。
标签: gluon gluon-mobile javafxports