代号一个转换表单自动滚动到顶部

时间:2018-12-29 03:10:03

标签: animation codenameone transition

我有一个包含许多使用幻灯片过渡的组件的应用程序。

直接通过GridLayout将组件ScaleImageButtons和-Label添加到窗体。还涉及计时器事件,以使场景更加动态和吸引人

该表格当然是可滚动的。

现在,每次我调用表单并将其向下滚动时,一旦它变为动画,它将自动跳回到表单顶部的第一项。

但是该窗体应保持在当前滚动位置,而与动画项目的位置无关,无论该可见与否。

如何使表单保持当前滚动位置,而与当前动画项目的位置无关?

 formApps.setFocusScrolling(false); // does not help

这是代码:

(此代码经过编辑以反映工作解决方案)

Form formApps = new Form(new GridLayout(6, 2)); 
ArrayList<String> listApps = classStrings.listApps;

for (int i = 0; i < listApps.size(); i++) {

     Container container = new Container();
     ScaleImageButton scaleImageButton = new ScaleImageButton(image);
     SpanButton spanButton = new SpanButton(stringDescrip);

     container.add(scaleImageButton);

     UITimer uit00 = new UITimer(() -> {

        UITimer uit01 = new UITimer(() -> {

            container.replace(spanButton, scaleImageButton,
                    CommonTransitions.createCover(CommonTransitions.SLIDE_HORIZONTAL, true, slideInterval));

        });
        uit01.schedule(startInterval, false, formApps);

        UITimer uit02 = new UITimer(() -> {

            container.replace(scaleImageButton, spanButton,
                    CommonTransitions.createCover(CommonTransitions.SLIDE_HORIZONTAL, true, slideInterval));

        });
        uit02.schedule(repeatIntervalOne, false, formApps);

    });
    uit00.schedule(repeatIntervalOne, true, formApps);
});

form.setFocusScrolling(false);
form.add(container);
container.setScrollableY(true);
formApps.show();

1 个答案:

答案 0 :(得分:1)

您不应在此处直接使用Timerviolates the EDT。您应该将计时器回调包装在callSerially中,或者更好地使用UITimer,它是专门为此目的而设计的。

6x2是一个相对较小的网格,因此,随着元素大小的调整,很小的移动就足以使您到达顶部。网格的大小由其中所有元素的首选大小确定。如果scaleImageButtonspanButton大得多,则布局可能会“跳跃”,您最终会得到小得多的感觉,就像滚动一样,但由于较小的首选尺寸而只是一种新布局

一种解决方法是:

Component.setSameSize(scaleImageButton, spanButton);