Шаг 238.
Библиотека Qt.
Анимационный движок

    На этом шаге рассмотрим понятие анимационного движка.

    Qt предоставляет возможности анимации пользовательского интерфейса, которые базируются на изменении свойств объектов, таких как, например, размер, позиция, цвет и т. д.

    Новый механизм анимации позволяет использовать математические функции, называемые смягчающими линиями, которые позволяют более реалистично проводить изменения свойств объектов в заданном промежутке времени. Анимации могут группироваться друг с другом и совместно работать с машиной состояний. Анимации можно использовать для всех виджетов и элементов GraphicsView. Новая реализация базируется на классах, показанных в диаграмме рис. 1.


Рис.1. Взаимодействие классов анимационного движка

    Класс QAbstractAnimation это базовый класс, он абстрагирует таймер и его события и имеет все основные слоты для управления анимацией, такие как start(), stop() и pause() для запуска, приостановки и останова анимации. В сигнале stateChanged() этот класс предоставляет всю информацию, когда анимация началась и когда закончилась. Этот класс наследуют три класса: первый — это QVariantAnimation, второй — QAnimationGroup и третий — QPauseAnimation. Слово Variant класса QVariantAnimation означает, что этот класс может анимировать различные типы, цвет, целые значения, а также и любой другой тип, если к нему есть интерполятор. Мы в основном будем использовать унаследованный от QVariantAnimation класс QPropertyAnimation, потому что это конкретный класс, работающий со свойствами объекта.

    Создадим анимацию для виджета (рис. 2), которая будет изменять свойство цвета. Приведем фрагмент программы:


Рис.2. Цветовая анимация

QLabel lbl;//создаем виджет класса QLabel
lbl.setPixmap(QPixmap("happyos.png"));//устанавливаем в нем растровое изображение
QGraphicsColorizeEffect effect;//создаем объект эффекта цвета
lbl.setGraphicsEffect(&effect);//устанавливаем его в виджете надписи 
QPropertyAnimation anim(&effect, "color");/*создаем объект анимации свойств, передаем
                                            в конструкторе адрес на объект эффекта
                                            effect,а во втором параметре имя свойства
                                            color, которое хотим анимировать*/
anim.setStartValue(Qt::gray);//задаем начальное цветовое значение
anim.setKeyValueAt(0.25f, Qt::green);/*задаем ключевые значения
                                       на промежутке от 0 до 1*/
anim.setKeyValueAt(0.5f, Qt::blue);
anim.setKeyValueAt(0.75f, Qt::red);
anim.setEndValue(Qt::black);//задаем конечное цветовое значение
anim.setDuration(3000);/*задаем время продолжительности изменения значений от
                       стартового до конечного в миллисекундах (3000 мс или 3 сек.)*/
anim.setLoopCount(-1);/*устанавливаем количество исполнения цикла анимации,
                        а передача в качестве аргумента отрицательного значения,
                        устанавливает бесконечное количество раз*/
anim.start();//выполняем запуск анимации 
lbl.show();

    Файлы приложения можно взять здесь.

    Класс QAnimationGroup является контейнером для анимаций. Тут так же используется механизм объектной иерархии, т. е. модель предков и потомков, реализуемая классом QObject. Класс группы отвечает за анимацию всех его потомков. Сама группа для анимаций может быть либо последовательной, либо параллельной. Таким образом, если вы хотите создать анимации, которые работают одновременно друг с другом, то это должна быть параллельная группа. А вот анимации, которые исполняются в порядке очереди, должны находиться в последовательной группе. Кроме того, анимации могут быть добавлены в различные типы групп, как это показано в листинге:

QParallelAnimationGroup* pgroup1 = new QParallelAnimationGroup;/*создаем объект
                                                                параллельной группы*/
pgroup1->addAnimation(panim1);//добавляем в нее два указателя объектов анимации
pgroup1->addAnimation(panim2);
QSequentialAnimationGroup* pgroup2 = new QSequentialAnimationGroup;/*создаем объект
                                                            последовательной группы*/
pgroup2->addAnimation(panim3);
pgroup2->addAnimation(panim4);
pgroup2->addAnimation(panim5);
pgroup2->addAnimation(pgroup1);//добавляем объект анимационной группы
...
pgroup2->start();//запускаем исполнение всех анимаций в порядке созданной иерархии

    На следующем шаге рассмотрим смягчающие линии Easing Curves.




Предыдущий шаг Содержание Следующий шаг