目录
官方解析
easingCurve:QEasingCurve
这个属性保留了动画的缓和曲线。
他定义了缓和取消,默认情况下,使用线性缓和曲线,产生线性插入值。下面举出其他曲线的例子:
QEasingCurve::InCirc 这个属性提供了圆形入口曲线。
QEasingCurve::InOutElastic这个属性为插入值提供了弹性效果。
QVarantAnimation将使用QEasingCure::valueForProgress()将把动画的“常规进度”(currentTime/totalDuration)转化为动画使用的实际有效进度。当interpolated()被调用时这将会是一个有效的进度。所以keyValues里的步骤将与有效进度相关联。
缓和曲线与插入器一起使用,interpolated()这个虚函数与动画的持续时间将控制当前动画进度改变的值。
博主例子
使用QEasingCurve::InOutSine实现动态旋转
本次例子很有趣!运行截图如下:
源码如下
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPoint>
QT_BEGIN_NAMESPACE
class QPropertyAnimation;
QT_END_NAMESPACE
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
Q_PROPERTY(qreal index READ index WRITE setIndex)
public:
explicit Widget(QWidget *parent = 0);
~Widget();
qreal index()const;
void setIndex(qreal index);
protected:
void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE;
private:
Ui::Widget *ui;
QPropertyAnimation *m_animation;
QList<QWidget*> listBtn;
QList<QPoint> listPoint;
qreal m_index;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPropertyAnimation>
#include <QKeyEvent>
#include <QDebug>
#include <QtMath>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
listBtn<<ui->pushButton;
listBtn<<ui->pushButton_2;
listBtn<<ui->pushButton_3;
listBtn<<ui->pushButton_4;
listPoint<<ui->pushButton->pos();
listPoint<<ui->pushButton_2->pos();
listPoint<<ui->pushButton_3->pos();
listPoint<<ui->pushButton_4->pos();
ui->pushButton->setFocusPolicy(Qt::NoFocus);
ui->pushButton_2->setFocusPolicy(Qt::NoFocus);
ui->pushButton_3->setFocusPolicy(Qt::NoFocus);
ui->pushButton_4->setFocusPolicy(Qt::NoFocus);
m_animation=new QPropertyAnimation(this,"index");
m_animation->setDuration(400);
m_animation->setEasingCurve(QEasingCurve::InOutSine);
this->setWindowTitle("CSDN IT1995");
m_index=0;
setIndex(0);
}
Widget::~Widget()
{
delete ui;
}
qreal Widget::index() const
{
return m_index;
}
void Widget::setIndex(qreal index)
{
m_index=index;
for(int i=0;i<listPoint.size();i++){
qreal a=((i+m_index)*2*M_PI)/listBtn.count();
int xs=200*qSin(a)+200;
int ys=200*qCos(a)+200;
QPointF pos(xs,ys);
listBtn[i]->setGeometry(xs,ys,100,50);
qDebug()<<listBtn[i]->pos();
}
}
void Widget::keyPressEvent(QKeyEvent *event)
{
int delta = 0;
switch(event->key())
{
case Qt::Key_Left:
delta = -1;
break;
case Qt::Key_Right:
delta = 1;
break;
default:
break;
}
if(m_animation->state()==QAbstractAnimation::Stopped&&delta){
m_animation->setEndValue(m_index+delta);
m_animation->start();
event->accept();
}
}