属性动画是一种设置对象属性值动画的机制。从Animatable派生的对象可以使用属性动画,这包括Node类以及所有Component和UIElement子类。
这是使用属性动画的两种方法。用户可以使用代码创建属性动画,然后将其应用于对象的属性。以下是浅色动画的简单代码:
SharedPtr<ValueAnimation> colorAnimation(new ValueAnimation(context_));
colorAnimation->SetKeyFrame(0.0f, Color::WHITE);
colorAnimation->SetKeyFrame(2.0f, Color::YELLOW);
colorAnimation->SetKeyFrame(4.0f, Color::WHITE);
light->SetAttributeAnimation("Color", colorAnimation, WM_LOOP);
在上面的代码中,我们首先创建一个名为colorAnimation的ValueAnimation对象,并为其设置三个关键帧值,然后将其指定给灯光的颜色属性。(此处注意:为了使动画看起来正确,循环模式的最后一个关键帧必须等于第一个关键帧)。
另一种方法是加载属性动画资源,下面是一个简单的示例:
ValueAnimation* colorAnimation = cache->GetResource<ValueAnimation>("Scene/LightColorAnimation.xml");
light->SetAttributeAnimation("Color", colorAnimation, WM_LOOP);
属性动画支持三种不同的包裹模式:
WM_LOOP:循环模式,当动画到达结尾时,它将从头循环。
WM_ONCE:播放一次模式,当动画完成时,它将从对象中删除。
WM_CLAMP:钳制模式,当动画完成时,它将保持最后一个关键帧的值。
可以动态调整动画的播放速度(默认值为1或“原始速度”)以及动画的包裹模式。
ObjectAnimation类可用于将影响不同属性的多个值动画组合在一起。例如,当用户想要为灯光应用位置和颜色动画时,可以使用以下代码。请注意,对象动画附加到灯光的场景节点,因此需要特殊语法来引用灯光组件的属性。
// Create light animation
SharedPtr<ObjectAnimation> lightAnimation(new ObjectAnimation(context_));
// Create light position animation
SharedPtr<ValueAnimation> positionAnimation(new ValueAnimation(context_));
// Use spline interpolation method
positionAnimation->SetInterpolationMethod(IM_SPLINE);
// Set spline tension
positionAnimation->SetSplineTension(0.7f);
positionAnimation->SetKeyFrame(0.0f, Vector3(-30.0f, 5.0f, -30.0f));
positionAnimation->SetKeyFrame(1.0f, Vector3( 30.0f, 5.0f, -30.0f));
positionAnimation->SetKeyFrame(2.0f, Vector3( 30.0f, 5.0f, 30.0f));
positionAnimation->SetKeyFrame(3.0f, Vector3(-30.0f, 5.0f, 30.0f));
positionAnimation->SetKeyFrame(4.0f, Vector3(-30.0f, 5.0f, -30.0f));
// Set position animation
lightAnimation->AddAttributeAnimation("Position", positionAnimation);
// Create light color animation
SharedPtr<ValueAnimation> colorAnimation(new ValueAnimation(context_));
colorAnimation->SetKeyFrame(0.0f, Color::WHITE);
colorAnimation->SetKeyFrame(1.0f, Color::RED);
colorAnimation->SetKeyFrame(2.0f, Color::YELLOW);
colorAnimation->SetKeyFrame(3.0f, Color::GREEN);
colorAnimation->SetKeyFrame(4.0f, Color::WHITE);
// Set Light component's color animation
lightAnimation->AddAttributeAnimation("@Light/Color", colorAnimation);
// Apply light animation to light node
lightNode->SetObjectAnimation(lightAnimation);
也可以从文件加载对象动画,例如:
ObjectAnimation * lightAnimation = cache->GetResource<ObjectAnimation>("Scene/LightAnimation.xml");
lightNode->SetObjectAnimation (lightAnimation);
属性动画对浮点类型(如float、Vector2、Vector3等)使用线性或样条插值,而对整数和非数字类型(如int、bool)不使用插值。或者,通过设置插值方法IM_NONE(请参见SetInterpolationMethod()),可以为任何数据类型禁用插值。这允许例如通过修改元素的图像矩形以覆盖一系列动画帧来设置UI元素的动画。
属性动画类
可设置动画:可设置动画的对象的基类,它可以在其单个属性上指定动画(ValueAnimation),或影响多个属性的动画(ObjectAnimation)。
ValueAnimation:包括单个属性的关键帧值
ObjectAnimation:包括一个或多个属性动画及其可动画对象的包裹模式和速度。
ValueAnimationInfo:属性动画的运行时实例的基类,包括引用的动画、换行模式、速度和时间位置。