Qt学习笔记——动画2
2016-09-03 16:25
330 查看
上一次做的效果不符合老板意思,需要图片连续显示,这次修改了代码,实现图片连续播放,代码如下:
#ifndef ANIMATION_H
#define ANIMATION_H
#include <QWidget>
#include <QTimer>
#include <QResizeEvent>
#include <QFrame>
#include <QSize>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>
class AnimationWidget : public QWidget
{
Q_OBJECT
public:
explicit AnimationWidget(QWidget *parent = 0);
~AnimationWidget();
signals:
public slots:
void nextImage();
void previousImage();
protected:
void resizeEvent(QResizeEvent *event);
private:
void flushAnimationTargetNext(int currentImg);
QSize windowsSize;
QPropertyAnimation *nextAnimation[2];
QParallelAnimationGroup *nextParallelGroup;
QFrame *imageFrame[4];
int currentAnimation;
};
#endif // ANIMATION_H
#include "animationwidget.h"
#include <QPoint>
#include <QTimer>
#include <QDebug>
#define ANIMATION_DURATION 2000
AnimationWidget::AnimationWidget(QWidget *parent) : QWidget(parent)
{
setWindowFlags(Qt::FramelessWindowHint);
windowsSize.setWidth(274);
windowsSize.setHeight(143);
currentAnimation = 0;
nextParallelGroup = new QParallelAnimationGroup(this);
for (int i = 0; i < 2; ++i)
{
nextAnimation[i] = new QPropertyAnimation(this);
nextParallelGroup->addAnimation(nextAnimation[i]);
}
for (int i = 0; i < 4; ++i)
{
imageFrame[i] = new QFrame(this);
imageFrame[i]->setObjectName("avatar");
imageFrame[i]->setStyleSheet(QString("QFrame#avatar{border-image:url(:/image/photo%1)}").arg(i+1));
}
flushAnimationTargetNext(currentAnimation);
resize(windowsSize);
connect(nextParallelGroup, SIGNAL(finished()), this, SLOT(nextImage()));
nextImage();
}
AnimationWidget::~AnimationWidget()
{
if (nextParallelGroup != NULL)
{
delete nextParallelGroup;
nextParallelGroup = NULL;
}
for (int i = 0; i < 2; ++i)
{
if (nextAnimation[i] != NULL)
{
delete nextAnimation[i];
nextAnimation[i] = NULL;
}
}
}
void AnimationWidget::nextImage()
{
nextParallelGroup->stop();
imageFrame[currentAnimation]->setVisible(false);
imageFrame[(currentAnimation+1)%4]->setVisible(true);
currentAnimation = (currentAnimation + 1) % 4;
imageFrame[currentAnimation]->setVisible(true);
imageFrame[(currentAnimation+1)%4]->setVisible(true);
flushAnimationTargetNext(currentAnimation);
nextParallelGroup->start();
}
void AnimationWidget::previousImage()
{
nextParallelGroup->stop();
flushAnimationTargetNext(currentAnimation);
nextParallelGroup->start();
}
void AnimationWidget::resizeEvent(QResizeEvent *event)
{
for (int i = 0; i < 4; ++i)
imageFrame[i]->setGeometry(-windowsSize.width(), 0, windowsSize.width(), windowsSize.height());
}
void AnimationWidget::flushAnimationTargetNext(int currentImg)
{
nextAnimation[0]->setStartValue(QPoint(0, 0));
nextAnimation[0]->setEndValue(QPoint(windowsSize.width(), 0));
nextAnimation[0]->setPropertyName("pos");
nextAnimation[0]->setTargetObject(imageFrame[currentImg]);
nextAnimation[0]->setDuration(ANIMATION_DURATION);
currentImg = (currentImg + 1) % 4;
nextAnimation[1]->setStartValue(QPoint(-windowsSize.width(), 0));
nextAnimation[1]->setEndValue(QPoint(0, 0));
nextAnimation[1]->setPropertyName("pos");
nextAnimation[1]->setTargetObject(imageFrame[currentImg]);
nextAnimation[1]->setDuration(ANIMATION_DURATION);
}
#ifndef ANIMATION_H
#define ANIMATION_H
#include <QWidget>
#include <QTimer>
#include <QResizeEvent>
#include <QFrame>
#include <QSize>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>
class AnimationWidget : public QWidget
{
Q_OBJECT
public:
explicit AnimationWidget(QWidget *parent = 0);
~AnimationWidget();
signals:
public slots:
void nextImage();
void previousImage();
protected:
void resizeEvent(QResizeEvent *event);
private:
void flushAnimationTargetNext(int currentImg);
QSize windowsSize;
QPropertyAnimation *nextAnimation[2];
QParallelAnimationGroup *nextParallelGroup;
QFrame *imageFrame[4];
int currentAnimation;
};
#endif // ANIMATION_H
#include "animationwidget.h"
#include <QPoint>
#include <QTimer>
#include <QDebug>
#define ANIMATION_DURATION 2000
AnimationWidget::AnimationWidget(QWidget *parent) : QWidget(parent)
{
setWindowFlags(Qt::FramelessWindowHint);
windowsSize.setWidth(274);
windowsSize.setHeight(143);
currentAnimation = 0;
nextParallelGroup = new QParallelAnimationGroup(this);
for (int i = 0; i < 2; ++i)
{
nextAnimation[i] = new QPropertyAnimation(this);
nextParallelGroup->addAnimation(nextAnimation[i]);
}
for (int i = 0; i < 4; ++i)
{
imageFrame[i] = new QFrame(this);
imageFrame[i]->setObjectName("avatar");
imageFrame[i]->setStyleSheet(QString("QFrame#avatar{border-image:url(:/image/photo%1)}").arg(i+1));
}
flushAnimationTargetNext(currentAnimation);
resize(windowsSize);
connect(nextParallelGroup, SIGNAL(finished()), this, SLOT(nextImage()));
nextImage();
}
AnimationWidget::~AnimationWidget()
{
if (nextParallelGroup != NULL)
{
delete nextParallelGroup;
nextParallelGroup = NULL;
}
for (int i = 0; i < 2; ++i)
{
if (nextAnimation[i] != NULL)
{
delete nextAnimation[i];
nextAnimation[i] = NULL;
}
}
}
void AnimationWidget::nextImage()
{
nextParallelGroup->stop();
imageFrame[currentAnimation]->setVisible(false);
imageFrame[(currentAnimation+1)%4]->setVisible(true);
currentAnimation = (currentAnimation + 1) % 4;
imageFrame[currentAnimation]->setVisible(true);
imageFrame[(currentAnimation+1)%4]->setVisible(true);
flushAnimationTargetNext(currentAnimation);
nextParallelGroup->start();
}
void AnimationWidget::previousImage()
{
nextParallelGroup->stop();
flushAnimationTargetNext(currentAnimation);
nextParallelGroup->start();
}
void AnimationWidget::resizeEvent(QResizeEvent *event)
{
for (int i = 0; i < 4; ++i)
imageFrame[i]->setGeometry(-windowsSize.width(), 0, windowsSize.width(), windowsSize.height());
}
void AnimationWidget::flushAnimationTargetNext(int currentImg)
{
nextAnimation[0]->setStartValue(QPoint(0, 0));
nextAnimation[0]->setEndValue(QPoint(windowsSize.width(), 0));
nextAnimation[0]->setPropertyName("pos");
nextAnimation[0]->setTargetObject(imageFrame[currentImg]);
nextAnimation[0]->setDuration(ANIMATION_DURATION);
currentImg = (currentImg + 1) % 4;
nextAnimation[1]->setStartValue(QPoint(-windowsSize.width(), 0));
nextAnimation[1]->setEndValue(QPoint(0, 0));
nextAnimation[1]->setPropertyName("pos");
nextAnimation[1]->setTargetObject(imageFrame[currentImg]);
nextAnimation[1]->setDuration(ANIMATION_DURATION);
}
相关文章推荐
- Android逐条加载ListView,实现动画更新
- Canvas文字碎片动画
- jQuery整理笔记六----jQuery动画
- javascript 自定义动画函数
- UGUI(五)动画系统
- 自定义Dialog 让Activity 不变暗 正在加载动画
- Android初级教程以动画的形式弹出窗体
- Android动画TranslateAnimation的使用
- 从Android动画到贝塞尔曲线
- Unity图片序列帧动画
- [转载]jQuery动画高级用法——详解animation中的.queue()函数
- MobileMenuScene来点动画效果
- 【动画教程】真封神南极服务端2.52架设第五集
- Android Easing Interpolator——一些动画插值器
- Android应用开发之所有动画使用详解
- iOS手机淘宝加入购物车动画分析
- 仿新浪微博加号弹出界面动画
- 【转】Qt动画组的简单使用
- Android Material Design动画 Curved motion | 曲线运动
- Android窗口抖动之动画实现