2015-07-04 20 views
5

Esiste un modo per applicare l'animazione quando si modifica la sorgente del componente Loader in QML? Per esempio supponiamo di avere la seguente Loader:Animazione per Qml Loader quando si modifica loader.source

Loader { 
    anchors.fill: parent 
    id: loader 
} 

voglio un'animazione da sinistra a destra quando ho impostato loader.source = "content.qml"

Grazie per qualsiasi aiuto.

risposta

3

Questo è un modo per farlo:

import QtQuick 2.4 
import QtQuick.Window 2.0 

Window { 
    id: window 
    width: 400 
    height: 400 
    visible: true 

    Loader { 
     id: loader 
     onSourceChanged: animation.running = true 

     NumberAnimation { 
      id: animation 
      target: loader.item 
      property: "x" 
      from: 0 
      to: window.width - loader.item.width 
      duration: 1000 
      easing.type: Easing.InExpo 
     } 
    } 

    // Replace this with some other action that changes the source. 
    Component.onCompleted: loader.source = "MyRectangle.qml" 
} 

MyRectangle.qml:

import QtQuick 2.0 

Rectangle { 
    id: rect 
    color: "red" 
    width: 150 
    height: 150 
} 
+0

Grazie. Funziona, anche se non era bello come pensavo. Non è un approccio pulito aggiungere animazione al componente loader. A volte corre più veloce e altre volte più lento e con fastidioso ritardo! Grazie comunque. –

+1

Si potrebbe provare a cambiare 'onSourceChanged' su' onStatusChanged' e avviare l'animazione solo se 'status' è' Loader.Ready'? Senza avere il codice per riprodurre la lentezza, è difficile offrire più consigli. Puoi incollare una versione semplificata (ma comunque "pesante") dell'elemento caricato dal 'Loader', così posso provarlo. – Mitch

3

E 'obbligatorio l'uso di un Loader?

In caso contrario, è possibile utilizzare uno StackView (ovviamente con profondità 1 se non si desidera offrire una navigazione più complessa) e caricare i componenti spingendoli sullo stack con il set di opzioni replace al vero

Detto questo, è possibile ottenere il risultato che si sta chiedendo come segue:

StackView { 
    delegate: StackViewDelegate { 
     function transitionFinished(properties) { 
      properties.exitItem.x = 0 
     } 

     pushTransition: StackViewTransition { 
      PropertyAnimation { 
       target: enterItem 
       property: "x" 
       from: enterItem.width 
       to: 0 
      } 

      PropertyAnimation { 
       target: exitItem 
       property: "x" 
       from: 0 
       to: -exitItem.width 
      } 
     } 
    } 
} 

mi scuso se non funziona come è (anche se dovrebbe), ma sono su un cellulare telefono e non posso testarlo adesso.

+0

Non posso usare questa alternativa. Ho usato il componente Caricatore per creare una vista tabulazioni personalizzata. Non è possibile utilizzare Stack View nel mio caso perché è necessario modificare solo il contenuto della scheda, non tutta la pagina. dopotutto è stato utile per qualcuno che preferisce lo stack view. Grazie per la tua risposta. –

+0

@ a.toraby Anche se sono in ritardo, non rendere StackView l'elemento principale! –