2016-04-06 6 views
2

Я создал пользовательский слой, в соответствии с этим материалом: http://docs.gluonhq.com/charm/2.1.1/#_creating_a_layer, и добавить его к моему заявлению:Можно ли использовать переходы на глинистых слоях?

MobileApplication.getInstance().addLayerFactory(LAYER_NAME,() -> customLayer); 

Теперь я хотел бы добавить переход к этому слою. Вы можете использовать переходы на View: view.setShowTransitionFactory(BounceInDownTransition:new)

Layer не предоставляет такой метод. Так что я попробовал этот подход, чтобы применить переход:

private void showLayer() { 
    MobileApplication.getInstance().showLayer(LAYER_NAME); 
    new BounceInDownTransition(customLayer).play(); 
} 

Когда я звоню showLayer() впервые переход оказывается неполным. Первая часть, где слой должен выйти из поля зрения, отсутствует. Каждый последующий вызов showLayer() показывает полный переход.

Являются ли слои предназначены для использования в сочетании с переходами вообще? Если возможно, то, что рекомендуется?

+0

код [релиз] (http://gluonhq.com/gluon-mobile-2-2-0-released/) нового Charm Версия 2.2.0 уже включает переходы уровня –

ответ

2

Вы можете использовать встроенные переходы в Gluon Charm, так как все, что вам нужно, это передать им узел и вызвать игру, чтобы начать анимацию.

В случае слоев Gluon нет встроенного механизма для Views, но вы можете легко добавить его в свой класс.

Это создаст эффект отскока для показа и эффекта отскока для скрытия.

public class MyLayer extends Layer { 

    private final Node root; 
    private final double size = 150; 

    public MyLayer() { 
     final BounceInDownTransition transitionIn = new BounceInDownTransition(this, true); 
     final BounceOutDownTransition transitionOut = new BounceOutDownTransition(this, true); 
     transitionOut.setOnFinished(e -> hide()); 

     Button button = new Button("", MaterialDesignIcon.CLOSE.graphic()); 
     button.setOnAction(e -> transitionOut.playFromStart()); 
     root = new StackPane(button); 
     root.setStyle("-fx-background-color: white;"); 
     getChildren().add(root); 

     getGlassPane().getLayers().add(this); 

     showingProperty().addListener((obs, ov, nv) -> { 
      if (nv) { 
       layoutChildren(); 
       setOpacity(0); 
       transitionIn.playFromStart(); 
      } 
     }); 
    } 

    @Override 
    public void show() { 
     getGlassPane().setBackgroundFade(GlassPane.DEFAULT_BACKGROUND_FADE_LEVEL); 
     super.show(); 
    } 

    @Override 
    public void hide() { 
     getGlassPane().setBackgroundFade(0.0); 
     super.hide(); 
    } 

    @Override 
    public void layoutChildren() { 
     root.setVisible(isShowing()); 
     if (!isShowing()) { 
      return; 
     } 
     root.resize(size, size); 
     resizeRelocate((getGlassPane().getWidth() - size)/2, (getGlassPane().getHeight()- size)/2, size, size); 
    } 
} 

А теперь добавьте слой:

@Override 
public void init() { 
    addViewFactory(BASIC_VIEW,() -> new BasicView(BASIC_VIEW)); 

    addLayerFactory("My Layer",() -> new MyLayer()); 
} 
+0

Все еще получает тот же эффект. Первый кадр (ы) перехода отсутствует ... – jns

+0

Да, я тоже это заметил. Я отредактировал свой ответ с исправлением: вызовите 'layoutChildren()' перед запуском анимации. Во всяком случае, я создаю для этого внутреннюю проблему. –

+0

Эта проблема должна быть исправлена ​​с помощью [release] (http://gluonhq.com/gluon-mobile-2-2-released/) новой версии Charm 2.2.0. Вы можете проверить? –