Qt QML动画的另一个时间源?
我正在考虑构建一个gstreamer插件,用于渲染动画QML图形,以便稍后叠加到播放视频上。到目前为止,使用QML的想法对我来说非常有希望,除了一个问题。我需要能够在视频中寻找,动画也必须倒带和跳转到所需的时间点。现在我阅读了QML文档,我看到所有的动画通常都是有时间限制的 所以我的问题是:是否可以将QML动画绑定到一些“时间源”,而不是真实世界的时间,这可能不是单调的(事实上,它可以由应用程序操纵)。或者,更一般地说,我可以将QML动画绑定到一个数值X,这样当它发生变化时,我的动画就会继续,并且在X和动画状态之间有一个严格的关系。我希望你能理解。这个答案只适用于Qt QML动画的另一个时间源?,qt,animation,qml,Qt,Animation,Qml,我正在考虑构建一个gstreamer插件,用于渲染动画QML图形,以便稍后叠加到播放视频上。到目前为止,使用QML的想法对我来说非常有希望,除了一个问题。我需要能够在视频中寻找,动画也必须倒带和跳转到所需的时间点。现在我阅读了QML文档,我看到所有的动画通常都是有时间限制的 所以我的问题是:是否可以将QML动画绑定到一些“时间源”,而不是真实世界的时间,这可能不是单调的(事实上,它可以由应用程序操纵)。或者,更一般地说,我可以将QML动画绑定到一个数值X,这样当它发生变化时,我的动画就会继续,并
NumberAnimation
对象。可能类似的方法也可用于替换其他动画
对象
正如上文所述,除了解决问题,没有其他办法
这是我解决这个问题的办法。它可能看起来很复杂,但我可以保证它很容易使用。在这个答案的最后,我放了一个链接到使用这个代码的示例项目的源代码。你可以试试
将以下文件添加到项目中:
- 评估进展的价值
- XValueAnimation.qml
#include <QQmlContext>
#include "easingvalueforprogress.h"
现在您可以这样使用它(而不是NumberAnimation
object):
我提供了一个工程实例。欢迎下载并测试。QML内部设计通常不是很灵活,似乎动画组件也不例外。根据你到底想做什么,可能有不同的方法来解决这个问题。您可以轻松实现自定义动画,并且不必遵循内置is设计。你可能只需要一些州的微调。谢谢你,菲利普,我将你的答案标记为已接受。然而,随着时间的推移,我有更多的时间来考虑这一切,我相信我不会走QML路线。但如果我接受,我会用你的答案。再次感谢!
#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)
}
}
#include <QQmlContext>
#include "easingvalueforprogress.h"
EasingValueForProgress easingValueForProgress;
engine.rootContext()->setContextProperty(
"easingValueForProgress", &easingValueForProgress);
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
}