QML动画的另一个时间源?

时间:2015-11-08 19:40:45

标签: qt animation qml

我正在考虑构建一个gstreamer插件,该插件可以渲染动画QML图形,以便以后叠加到播放视频上。到目前为止,除了一个问题外,使用QML的想法看起来很有希望。我需要能够在视频中进行搜索,动画也必须回放并跳转到所需的时间点。现在我读了QML文档,我发现所有动画通常都有时间限制。

所以我的问题是:是否有可能将QML动画绑定到某个“时间源”,而不是现实世界时间,这可能不是单调的(实际上,它可以由应用程序操纵)。或者,更一般地说,我可以将QML动画绑定到数值X,这样当它改变时,我的动画进展,并且X和动画状态之间存在严格的关系。我希望你明白这一点。

1 个答案:

答案 0 :(得分:1)

此答案仅适用于NumberAnimation个对象。也可以使用类似的方法来替换其他Animation对象。

正如ddriver已经说过的那样,除了解决方法之外别无他法。

这是我解决问题的方法。它可能看起来很复杂,但我可以保证它很容易使用。在这个答案的最后,我使用此代码链接到示例项目的源代码。你可以尝试一下。

将这些文件添加到您的项目中:

  • easingvalueforprogress.h

#ifndef EASINGVALUEFORPROGRESS_H
#define EASINGVALUEFORPROGRESS_H

#include <QObject>
#include <QEasingCurve>

class EasingValueForProgress : public QObject
{
    Q_OBJECT
public:
    explicit EasingValueForProgress(QObject *parent = 0);

    Q_INVOKABLE double getValue(int easingEnum, double progress){
        QEasingCurve easing((QEasingCurve::Type)easingEnum);
        return easing.valueForProgress(progress);
    }

signals:

public slots:
};

#endif // EASINGVALUEFORPROGRESS_H
  • easingvalueforprogress.cpp

#include "easingvalueforprogress.h"

EasingValueForProgress::EasingValueForProgress(QObject *parent) : QObject(parent)
{

}
  • XValueAnimation.qml

import QtQuick 2.0

Item {
    id: xValueAnimator

    property Item target
    property string targetProperty
    property double from
    property double to
    property int easing: Easing.Linear
    property double xValue

    onXValueChanged: {
        if (target.hasOwnProperty(targetProperty)) {
            target[targetProperty] = calculateCurrentValue(
                        from, to, easing, xValue);
        }
        else
            console.error("XValueAnimator: target:", target,
                          "does not have property", targetProperty)
    }

    function calculateCurrentValue(
        defaultFrom, defaultTo, animationEasing, xValue) {

        return defaultFrom + (defaultTo - defaultFrom)
                * easingValueForProgress.getValue(animationEasing, xValue)
    }
}

将此添加到您的main.cpp:

#include <QQmlContext>
#include "easingvalueforprogress.h"

    EasingValueForProgress easingValueForProgress;
    engine.rootContext()->setContextProperty(
                "easingValueForProgress", &easingValueForProgress);

现在您可以像这样使用它(而不是NumberAnimation对象):

XValueAnimator {
    target: object_you_want_to_affect     // for example id of the object
    targetProperty: "property_to_affect"  // for example "x"
    from: 100
    to: 500
    easing: Easing.OutQuad                // omit to use Easing.Linear
    xValue: myXValue                      // your property holding values from 0 to 1
}

Here我提供了工作示例项目。随意下载并测试它。