Как анимировать множество эллипсов вдоль пути с разной скоростью? - PullRequest
0 голосов
/ 21 февраля 2019

Я анимирую ток в цепи в виде эллипсов.Я создаю 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();
}
...