PropertyAnimation 与 NumberAnimation

Posted

技术标签:

【中文标题】PropertyAnimation 与 NumberAnimation【英文标题】:PropertyAnimation vs. NumberAnimation 【发布时间】:2019-04-06 16:49:42 【问题描述】:

下面的 QML 代码为两个矩形设置动画。一个使用PropertyAnimation,而另一个使用NumberAnimation。两个矩形的移动方式相似。我看不出这两种动画类型有什么不同。

import QtQuick 2.0
import QtQuick.Window 2.0

Window 
    visible: true
    width: 640
    height: 480

    Rectangle 
        id: r1
        width: 100; height: 100
        color: "red"

        Behavior on x  PropertyAnimation  
    

    Rectangle 
        id: r2
        y: 150
        width: 100; height: 100
        color: "blue"

        Behavior on x  NumberAnimation  
    

    // click anywhere to start animation
    MouseArea  anchors.fill: parent; onClicked: r1.x = r2.x = 200 

PropertyAnimationNumberAnimation有什么区别;什么时候应该使用其中一个?

【问题讨论】:

尝试为color 制作动画,您会看到不同。 【参考方案1】:

tl;博士。

NumberAnimation派生PropertyAnimation,因此,它们表现出相似的行为是合乎逻辑的。

NumberAnimation 是一个专门的 PropertyAnimation,它定义了数值变化时要应用的动画。 (Source)

虽然NumberAnimation 特别 动画数值(例如xywidthopacity),PropertyAnimation通用和可以动画非数字的(例如colorsize)。


Lé更长的答案:

1。 PropertyAnimation 可以为非数字类型设置动画。 NumberAnimation 仅对数字进行动画处理。

NumericAnimation 可以为 x、y、宽度、高度、不透明度等数字属性设置动画。但它不能为颜色设置动画,size 或 points。

这是一个示例,其中动画类型在为 color 属性设置动画时有所不同。第一个矩形从红色过渡到绿色,而第二个矩形保持蓝色。在这种情况下,应使用PropertyAnimation 而不是NumberAnimation

Rectangle 
    id: r1
    width: 100; height: 100
    color: "red"

    Behavior on color  PropertyAnimation    // works


Rectangle 
    id: r2
    y: 150
    width: 100; height: 100
    color: "blue"

    Behavior on color  NumberAnimation    // fails


MouseArea  anchors.fill: parent; onClicked: r1.color = r2.color = "green" 

但话又说回来,你可以ColorAnimation 代替...

2。 PropertyAnimation 是通用的。

这是 #1 的补充。但这本身就是另一个优势。

由于PropertyAnimation 更通用,如果您决定使用动态PropertyAnimation::property,则可以使用它。

以下是动画属性由用户提供的示例:

Rectangle 
    id: rect
    width: 100; height: 100
    color: "red"
    PropertyAnimation  id: animation; target: rect 


MouseArea  
    anchors.fill: parent
    onClicked:  
        animation.property = t1.text;
        animation.to = t2.text;
        animation.start();
    


Row 
    width: parent.width; height: 50
    anchors.bottom: parent.bottom
    TextField  id: t1; width: parent.width/2; height: 50; placeholderText: "property" 
    TextField  id: t2; width: parent.width/2; height: 50; placeholderText: "to" 

使用NumberAnimation 也可以,但将可行属性限制为仅限数字属性...用户无法模拟超新星或彩虹。 :(

3。 NumberAnimation 是严格的。

让我们比较一下fromto 属性。

NumberAnimation from: real to: real PropertyAnimation from: variant to: variant

这使得NumberAnimation 更加严格。 QML 将防止你犯愚蠢的错误:

NumberAnimation 
    id: animation
    to: "green"    //  Invalid property assignment: number expected   

当您严格限制动画数量时使用它。

这也意味着使用NumberAnimation 可以提高可读性沟通。它告诉阅读您的代码的人,您只打算为数字添加动画效果,而不是锚点、颜色、独角兽或其他任何东西。

4。 NumberAnimation 在动画数字方面效率更高。

– Qt 说:

专门的属性动画类型比 PropertyAnimation 类型有更高效的实现。 (Source)

这里,“特殊类型”指的是NumberAnimation,以及other types,例如AnchorAnimationColorAnimation

我没有尝试对 QML 进行剖析来对差异进行基准测试,但似乎选择动画类型的经验法则是:

如果要为数字设置动画,则应默认为 NumberAnimationPropertyAnimation 应该是最后的手段(更喜欢other types)。

【讨论】:

以上是关于PropertyAnimation 与 NumberAnimation的主要内容,如果未能解决你的问题,请参考以下文章

结合使用 Animators 和 PropertyAnimation 的 QML 过渡动画

qt qml中PropertyAnimation的几种使用方法

属性动画(PropertyAnimation)好玩的粘性控件

qml----动画入门(简单的动画实现 NumberAnimation类)

Animation & Property Animation 使用

android---动画