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