QTimeline动画

时间:2009-05-06 23:26:31

标签: c++ qt animation

我正在使用QGraphics对象来显示它们之间带箭头的框。我希望动画在那些从一端开始然后到另一端的箭头/线上。

当QTimeLine执行期间箭头的开始和结束位置没有改变时,动画效果很好,即我将视图保持静态。 但是由于用户可以拖动框(因此我重绘了箭头),我需要重置QGraphicsItemAnimation内的开始和结束位置,以便动画与新箭头线匹配。

我尝试更新Arrow对象的paint方法中的开始和结束位置,但这只会使动画变得疯狂(它会随机翻转到整个地方)。我假设这是因为我在QTimeLine对象处于RUNNING状态时更改了动画位置。

void Arrow::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
   ...
    ///update the arrow to have a new source and destination, draw arrow, etc
   ...

    if (mAnimate)
    {
        mAnimationObj->setPosAt(0, mSourcePoint);
        mAnimationObj->setPosAt(1, mDestPoint);   
    }
}

我应该如何动态更改QGraphicsItemAnimation开始和结束位置(0和1)?

对于最终产品,我希望用户能够拖动框,使箭头跟随(当前有效),并使动画沿新箭头路径继续。

如果那是不可能的,那么我需要找出一些方法来捕捉拖动和停止箭头动画,直到用户发布然后我想重置它......?

1 个答案:

答案 0 :(得分:4)

我猜你只需制作一个通用动画,即使用QTimeLine来设置0.0到1.0之间的动画。从currentValue开始,interpolation(自己动手)找出需要放置动画对象的位置。例如,对于值0.5,对象应位于起始位置和结束位置的中间位置。

请注意,如果起始位置和结束位置之间的距离不断变化,则此补间技巧不起作用。您可能会使动画对象在动画中间反复前进和后退。这样做的一个技巧是保持动画对象位置和起始位置之间的距离,如果当前时间的插值距离小于前一个,则不要推回对象。移动起点和终点之间有更复杂的技术,但我不会在这里详细说明,除非有必要。