2016-01-30 1 views
0

Я заметил очень странное поведение анимации с QML. Я разработал тестовое приложение, чтобы попасть в функции анимации. На моем компьютере в офисе я установил Qt 5.4 под Windows 7 64 бит.Неверная продолжительность анимации

Я уверен, что анимация «сыграна» быстрее ожидаемой продолжительности. , например.

// *** Image item for "Failure" event *** 
    Image{ 
     id: failPanel 
     x: 300 
     y: -300 
     source: "images/fail.png" 
     scale: 0.5 
     visible: false 

     function startAnim() { 
      visible = true 
      x = 300 
      y = -300 
      failAnim.restart() 
     } 

     SequentialAnimation { 
      id: failAnim 
      NumberAnimation{ target: failPanel; property: "y"; to:300; duration: 700; easing.type: Easing.InOutQuad} 
      NumberAnimation{ target: failPanel; property: "y"; to:500; duration: 2000 } 
      NumberAnimation{ target: failPanel; property: "x"; to:-1500; duration: 700; easing.type: Easing.InBack} 
     } 
    } 

Все играют гораздо быстрее, чем указанный период времени я не обратил на него внимания, пока я не перекомпилировать тот же исходный код дома с гораздо быстрее ПК (Windows 8 64 бит). На моем персональном компьютере анимация воспроизводится в ожидаемые сроки ...

Очень странно. Ну, интересно, кто-то уже испытал эту проблему, или если есть определенные настройки QML, связанные с этой темой?

+0

Вот пара идей: (1) масштаб установлен на 0,5, возможно, это влияет на то, как анимация появляется в вашем мозгу, даже если она занимает такое же количество времени, или (2), возможно, попробуйте установить продолжительность до 5 секунд и синхронизировать его с таймером или часами/часами. – iBelieve

ответ

2

Вы можете проверить, является ли правильным использованием JavaScript «s Date объект сроки:

import QtQuick 2.0 
import QtQuick.Window 2.0 

Window { 
    id: root 
    y: 30 
    width: 1000 
    height: 800 
    visible: true 

    Rectangle{ 
     id: failPanel 
     x: 300 
     y: -300 
     color: "red" 
     scale: 0.5 
     width: 400 
     height: 400 
     visible: false 

     property var startDate 

     Component.onCompleted: startAnim() 

     function startAnim() { 
      visible = true 
      x = 300 
      y = -300 
      failAnim.restart() 

      startDate = new Date() 
      print("started animation at", startDate.toISOString()) 
     } 

     SequentialAnimation { 
      id: failAnim 
      NumberAnimation{ target: failPanel; property: "y"; to:300; duration: 700; easing.type: Easing.InOutQuad} 
      NumberAnimation{ target: failPanel; property: "y"; to:500; duration: 2000 } 
      NumberAnimation{ target: failPanel; property: "x"; to:-1500; duration: 700; easing.type: Easing.InBack} 

      onStopped: print("finished animation at", new Date().toISOString()) 
     } 
    } 
} 

Для меня (Windows 10, Qt 5.6), он работает:

qml: started animation at 2016-01-31T06:29:31.209Z 
qml: finished animation at 2016-01-31T06:29:34.631Z 

Ваш Проблемные звуки похожи на this ошибка. Возможно, вы сможете найти похожие.

Я также рекомендую попробовать с более новой версией Qt, если это возможно.

+0

Я уже измерил время исполнения в пятницу. И это действительно неверно. Однако спасибо за предоставленный вами Qt bugreport. Это, по-видимому, серьезная ошибка в Qt 5.4.1. Это также описано здесь: https://bugreports.qt.io/browse/QTBUG-42699 Qt 5.4.1, похоже, затронут, и эта версия используется в офисе. Есть способ обхода некоторых настроек env, но я буду тестировать с более новой версией Qt. Дома я использую Qt 5.5, и он просто отлично работает. – Zyend

0

У нас была аналогичная проблема в компании, в которой я работаю. Проблема заключалась в том, что мы запустили основной поток за несколько миллисекунд после запуска анимации. Если основной поток работает, gui не обновляется, так как никакие события обновления не обрабатываются. Когда элемент управления finaly возвращается в цикл событий, все события обновления обрабатываются сразу, заставляя анимацию ro работать быстрее.

Решение заключается в том, чтобы запустить анимацию, как только ваша программа простаивает. Самый простой способ сделать это - это, вероятно, подключить слот для запуска анимации с помощью сигнала с использованием очереди. Затем анимация начнется после того, как controll будет передан eventloop.

 Смежные вопросы

  • Нет связанных вопросов^_^