如何沿路径以不同的速度设置许多椭圆形的动画?

时间:2019-02-21 17:58:02

标签: qt qgraphicsitem qpropertyanimation

我正在将电路中的电流设置为椭圆形。 我为每个水平/垂直线段创建一个AnimationPathItem,该线段的大小是其两倍,并在该线中无限循环地移动。这条线知道椭圆动画的速度。

ellipses moving horizontally to the right 这种方法看起来不太好,因为从一个线段过渡到另一个线段可能会暴露半个圆。

有更好的方法吗?如果每个椭圆经过一个节点,是否可以分别为其设置动画并更改速度?下方的线段知道速度,因此必须以某种方式将这些信息传递给动画对象。 创建这么多QPropertyAnimation对象时可能会出现性能问题吗?

(为简单起见,此代码仅在右侧显示水平动画)

AnimationPathItem::AnimationPathItem(QGraphicsItem *parent): QGraphicsWidget(parent)
{
    setCacheMode(QGraphicsItem::DeviceCoordinateCache);
    int len = boundingRect().width();
    qreal start = -boundingRect().width();

    while (true)
    {
        QPointF p(start, 0);
        mEllipseItems.append(p);
        start += ELLIPSE_SIZE;
        if(start + ELLIPSE_SIZE > len) {
           break;
        }
    }

void AnimationPathItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setBrush(Qt::gray);
    for (int i = 0; i < mEllipseItems.size(); i++)
    {
        painter->drawEllipse(mEllipseItems[i], ELLIPSE_SIZE /2, ELLIPSE_SIZE /2);
    }
}

QRectF AnimationPathItem::boundingRect() const
{
    return QRectF(0, 0, 2*parentItem()->boundingRect().width(), 2*parentItem()->boundingRect().height());
}

void AnimationPathItem::Animate(double speed) {
    mAnimation = new QPropertyAnimation(this, DNTs("pos"));
    mAnimation->setStartValue(QPointF(-boundingRect().width(), 0);
    mAnimation->setEndValue(QPointF(boundingRect().left(), 0);
    int duration = boundingRect().width() / speed;
    mAnimation->setDuration(duration);
    mAnimation->setEasingCurve(QEasingCurve(QEasingCurve::Linear));
    mAnimation->start();
}

0 个答案:

没有答案