2017-01-17 2 views
1

Wie immer wenn vor dem Versuch, Funktionen zu verwenden, die ich nicht vertraut bin, schrieb ich eine kleine Form Nachkommen Klasse, um zu verstehen, com.codename1.ui.Container.replace(Component, Component, Transition).Falsche Größen oder Offsets während der Animation

Eine Sache, die beim Spielen mit meinem Formular offensichtlich ist, ist, dass während der Animation die Komponenten unterschiedliche Größen und/oder Offsets haben, als wenn sie nicht animiert sind. Ich bin mir sicher, dass das nicht beabsichtigt ist, oder?

Die andere Sache, die ich entdeckt habe, ist, dass die Befehlsinstanz, die ich der Symbolleiste hinzugefügt habe, ausführbar bleibt, auch wenn ihre enabled Eigenschaft auf false festgelegt ist. Was sollte hier zu erwarten sein?

Siehe Code:

public class FormReplaceComponent extends Form { 
    private Component componentActual; 
    private Command commandReplace; 

    public FormReplaceComponent() { 
     setTitle("FormReplaceComponent"); 
     setScrollable(false); 
     setLayout(new BorderLayout()); 
     Container contentPane = getContentPane(); 
     FloatingActionButton badge = FloatingActionButton.createBadge("123"); 
     contentPane.add(BorderLayout.CENTER, badge); 
     componentActual = badge; 
     SpanLabel spanLabel = new SpanLabel(
       "The quick brown fox jumps over the lazy dog"); 
     CommonTransitions commonTransitions = CommonTransitions.createFade(800); 
     Transition transitionWrapper = new Transition() { 
      @Override 
      public void initTransition() { 
       commandReplace.setEnabled(false); 
       commonTransitions.init(getSource(), getDestination()); 
       commonTransitions.initTransition(); 
      } 
      @Override 
      public void paint(Graphics aGraphics) { 
       commonTransitions.paint(aGraphics); 
      } 
      @Override 
      public boolean animate() { 
       return commonTransitions.animate(); 
      } 
      @Override 
      public void cleanup() { 
       commonTransitions.cleanup(); 
       commandReplace.setEnabled(true); 
       super.cleanup(); 
      } 
     }; 
     commandReplace = new Command("Replace") { 
      public void actionPerformed(ActionEvent aActionEvent) { 
       if (componentActual == badge) { 
        contentPane.replace(badge, spanLabel, transitionWrapper); 
        componentActual = spanLabel; 
       } else { 
        contentPane.replace(spanLabel, badge, transitionWrapper); 
        componentActual = badge; 
       } 
      } 
     }; 
     getToolbar().addCommandToRightBar(commandReplace); 
    } 
} 

Antwort

0

‚ersetzen‘ benötigt Komponenten von ähnlicher Größe sonst werden Sie einen Sprung aufgrund der Art der Funktionalität zu sehen. Wir verwenden normalerweise Component.setSameSize() auf ihnen.

Ich glaube nicht, dass der Transition Decorator, den Sie verwendet haben, richtig ist, aber es ist schwer zu sagen.

Aktiviert wird nur angewendet, bevor der Befehl hinzugefügt wird. Andernfalls müsste ein Befehl alle seine Komponenten verfolgen und dies könnte zu einem Leck führen. Sie können dafür findCommandComponent & aktiviert verwenden.

+0

Die Verwendung von 'com.codename1.ui.Toolbar.findCommandComponent (Command)' zum Aktualisieren des 'enabled'-Attributs funktioniert gut, danke. Aber auch wenn 'com.codename1.ui.Component.setSameSize (Component ...)' verwendet wird, was sowieso nicht nötig sein sollte, da die Komponenten 'com.codename1.ui.layouts.BorderLayout.CENTER' sind, Der Übergang malt die Komponenten sichtbar anders. Das passiert auch im Simulator und auf meinem iPhone 5S. –

+0

Das 'SpanLabel' bewegt sich scheinbar während der Animation nach unten und rechts. Das Abzeichen, ein 'FloatingActionButton', wächst offensichtlich. Liegt das daran, dass die Komponenten in Bilder gemalt werden, und das ist anders als direkt malen? –

+0

Das ist möglich. Ist es nur mit Fade oder passiert es mit anderen Übergängen? Kommt es vor, wenn Sie den Übergang direkt verwenden? –

Verwandte Themen