我正在将电路中的电流设置为椭圆形。
我为每个水平/垂直线段创建一个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();
}