我正在考虑构建一个gstreamer插件,该插件可以渲染动画QML图形,以便以后叠加到播放视频上。到目前为止,除了一个问题外,使用QML的想法看起来很有希望。我需要能够在视频中进行搜索,动画也必须回放并跳转到所需的时间点。现在我读了QML文档,我发现所有动画通常都有时间限制。
所以我的问题是:是否有可能将QML动画绑定到某个“时间源”,而不是现实世界时间,这可能不是单调的(实际上,它可以由应用程序操纵)。或者,更一般地说,我可以将QML动画绑定到数值X,这样当它改变时,我的动画进展,并且X和动画状态之间存在严格的关系。我希望你明白这一点。
答案 0 :(得分:1)
此答案仅适用于NumberAnimation
个对象。也可以使用类似的方法来替换其他Animation
对象。
正如ddriver已经说过的那样,除了解决方法之外别无他法。
这是我解决问题的方法。它可能看起来很复杂,但我可以保证它很容易使用。在这个答案的最后,我使用此代码链接到示例项目的源代码。你可以尝试一下。
将这些文件添加到您的项目中:
#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
#include "easingvalueforprogress.h"
EasingValueForProgress::EasingValueForProgress(QObject *parent) : QObject(parent)
{
}
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我提供了工作示例项目。随意下载并测试它。