Как анимировать множество эллипсов вдоль пути с разной скоростью?
Я анимирую ток в цепи в виде эллипсов. Я создаю AnimationPathItem
для каждого горизонтального / вертикального отрезка, который в два раза больше и перемещается в бесконечном цикле по линии. Линия знает скорость, которую она использует для анимации эллипсов.
Этот подход выглядит не очень хорошо, потому что переход от одного отрезка к другому может привести к появлению полукругов.
Есть ли лучший способ сделать это? Можно ли анимировать каждый отдельный эллипс и изменять скорость, если он проходит через узел? Сегмент линии внизу знает скорость и должен каким-то образом передавать эту информацию анимированному объекту. Может быть проблема производительности при создании так много 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();
}