Codename One - Popup, как переход формы - PullRequest
1 голос
/ 01 апреля 2019

Согласно руководствам по материалам о переходах, я хочу установить определенный внешний вид на экранах приложений, чтобы передать их иерархию.Это означает, что все переходы слева направо находятся на одном уровне или важности.Меньшие формы или короткие пользовательские вводы будут входить и выходить как простые всплывающие окна, а не по горизонтали, а по вертикали.

Ожидаемое поведение:

  1. В форме слайда используется значение по умолчаниюпереход.Функция Show () будет перемещать источник влево, а место назначения - справа.showback () будет перемещать источник слева, а место назначения - вправо.
  2. Всплывающая форма использует пользовательский переход: show () приведет к тому, что источник останется на месте (не будет перемещаться или переходить влюбым другим способом) и пункт назначения (всплывающее окно) будет скользить снизу.Функция Showback () приведет к тому, что источник (всплывающее окно) выдвинется вниз, открывая место назначения (главное окно) под ним.

Фактическое поведение

  1. форма слайда работает, как и ожидалось в моем сценарии.

  2. show () заставляет всплывающую форму скользить на экран снизу, в то время как исходная форма остается вместо, прикрытое (как и ожидалось). НО showback () заставляет главное окно скользить сверху, закрывая всплывающее окно.

Полный пример кода для отображения фактического поведения

public class MyApplication {

private Form current;
private Resources theme;

private Transition defaultInTrans = CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL, true, 300);
private Transition defaultOutTrans = CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL, true, 300);
private Transition popupInTrans = CommonTransitions.createCover(CommonTransitions.SLIDE_VERTICAL, false, 300);
private Transition popupOutTrans = CommonTransitions.createSlide(CommonTransitions.SLIDE_VERTICAL, false, 300);

public void init(Object context) {
    theme = UIManager.initFirstTheme("/theme");
    Toolbar.setGlobalToolbar(true);
}

public void start() {
    if (current != null) {
        current.show();
        return;
    }
    new MainForm().show();
}

public void stop() {
    current = getCurrentForm();
    if (current instanceof Dialog) {
        ((Dialog) current).dispose();
        current = getCurrentForm();
    }
}

public void destroy() {
}

class MainForm extends Form {
    public MainForm() {
        setLayout(BoxLayout.y());

        Button slideBut = new Button("Slide Form");
        Button popBut = new Button("Popup Form");
        add(slideBut).add(popBut);

        slideBut.addActionListener(e -> {
            new SlideForm().show();
        });

        popBut.addActionListener(e -> {
            new PopupForm(this).show();
        });
    }
}

class SlideForm extends Form {
    public SlideForm() {
        Style bg = getContentPane().getUnselectedStyle();
        bg.setBgTransparency(255);
        bg.setBgColor(0x00ff00);
        getToolbar().setBackCommand("", e -> {
            new MainForm().showBack();
        });
        add(new Label("Slide Form content"));
    }
}

class PopupForm extends Form {
    public PopupForm(Form orig) {
        Style bg = getContentPane().getUnselectedStyle();
        bg.setBgTransparency(255);
        bg.setBgColor(0xff0000);

        getToolbar().setBackCommand("", e -> {
            new MainForm().showBack();
            orig.setTransitionInAnimator(defaultInTrans);
            orig.setTransitionOutAnimator(defaultOutTrans);
        });
        add(new Label("This is a popup!"));

        // remove source animation to remain in place
        orig.setTransitionInAnimator(null);
        orig.setTransitionOutAnimator(null);

        // add transition for target popup to appear and vanish from/to the bottom
        setTransitionInAnimator(popupInTrans);
        setTransitionOutAnimator(popupOutTrans);
    }
}

}

Имея разные типы CommonTransition, входной переход против выходного перехода, параметр направления перехода и, кроме того, направление show () против showback () довольно запутанное.

  1. как мне добиться ожидаемого поведения, чтобы всплывающая форма правильно выдвигалась?

  2. Есть ли лучший способ или меньше кода, необходимого для этого?

Спасибо.

1 Ответ

1 голос
/ 02 апреля 2019

Cover имеет эффект in / out, когда слайд имеет только эффект out. Когда вы перемещаетесь из формы A в форму B, происходит одно движение, включающее обе формы, которые работают точно так же в обратном направлении. Однако с крышкой она скользит по верхней части формы А, в то время как последняя остается на месте, затем соскальзывает с нее, создавая впечатление, что форма А находилась под ней все время.

Это означает, что оба входа и выхода используются для передачи обоих режимов покрытия. Однако это может столкнуться с переходом из формы А, поэтому нам нужно временно отключить его.

например:.

removeTransitionsTemporarily(backTo);
f.setTransitionInAnimator(CommonTransitions.createCover(CommonTransitions.SLIDE_VERTICAL, false, 300));
f.setTransitionOutAnimator(CommonTransitions.createUncover(CommonTransitions.SLIDE_VERTICAL, true, 300));        


public static void removeTransitionsTemporarily(final Form f) {
    final Transition originalOut = f.getTransitionOutAnimator();
    final Transition originalIn = f.getTransitionInAnimator();
    f.setTransitionOutAnimator(CommonTransitions.createEmpty());
    f.setTransitionInAnimator(CommonTransitions.createEmpty());
    f.addShowListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            f.setTransitionOutAnimator(originalOut);
            f.setTransitionInAnimator(originalIn);
            f.removeShowListener(this);
        }
    });
}
...