Skip to content

SOUI 动画系统

Warning

The current page still doesn't have a translation for this language.

You can read it through google translate.

SOUI 提供了丰富的动画支持,允许开发者为控件和界面元素创建流畅的动画效果。本文档将介绍 SOUI 中的两种主要动画类型:基础动画(Animation)和组合动画(AnimationSet)。

基础动画(Animation)

基础动画是应用于控件的动画效果,例如透明度变化、旋转、平移和缩放等。这些动画直接作用于控件的视觉属性。

动画类型

SOUI 提供了几种预定义的动画类型:

  • SAlphaAnimation: 透明度动画
  • SRotateAnimation: 旋转动画
  • STranslateAnimation: 平移动画
  • ScaleAnimation: 缩放动画
  • SAnimationSet: 动画集合,可以同时播放多个动画

动画属性

所有基础动画都有一些共同的属性:

属性 描述
duration 动画持续时间(毫秒)
startOffset 动画开始前的延迟时间(毫秒)
fillEnable 是否启用填充效果, 只影响fillBefore
fillBefore 动画开始前是否应用变换
fillAfter 动画结束后是否保持变换
repeatCount 动画重复次数
repeatMode 重复模式(restart 或 reverse)
zAdjustment 动画期间的 Z 调整模式
interpolator 插值器,控制动画的速度曲线

SAnimationSet 详解

SAnimationSet 是一个特殊的动画类,它可以将多个动画组合在一起并同时播放。这种组合动画在实际开发中非常有用,可以创建复杂的动画效果。

主要特性

  • 组合动画: 可以将多个基础动画组合成一个动画集
  • 属性继承: SAnimationSet 的某些属性会被推送到所有子动画
  • 共享插值器: 可以选择是否在所有子动画之间共享插值器

属性继承规则

SAnimationSet 的某些属性会推送到子动画:

  • duration, repeatMode, fillBefore, fillAfter: 这些属性设置在 AnimationSet 上时,会推送到所有子动画
  • repeatCount, fillEnabled: 这些属性对 AnimationSet 被忽略
  • startOffset, shareInterpolator: 这些属性仅对 AnimationSet 本身有效

使用示例

<!-- 在 XML 中定义动画集合 -->
<set duration="1000" shareInterpolator="true">
    <alpha fromAlpha="0.0" toAlpha="1.0" />
    <scale fromXScale="0.5" toXScale="1.0" fromYScale="0.5" toYScale="1.0" />
    <translate fromXDelta="0" toXDelta="100" fromYDelta="0" toYDelta="0" />
</set>
// 在代码中创建动画集合
SAnimationSet* animSet = new SAnimationSet(true); // 共享插值器

// 创建透明度动画
SAlphaAnimation* alphaAnim = new SAlphaAnimation(0.0f, 1.0f);
alphaAnim->setDuration(1000);

// 创建缩放动画
SScaleAnimation* scaleAnim = new SScaleAnimation();
scaleAnim->init(0.5f, 1.0f, 0.5f, 1.0f, 
                SValueDescription(ABSOLUTE_VALUE, 0.5f), // pivotX
                SValueDescription(ABSOLUTE_VALUE, 0.5f)); // pivotY
scaleAnim->setDuration(1000);

// 创建平移动画
STranslateAnimation* transAnim = new STranslateAnimation();
transAnim->init(SValueDescription(ABSOLUTE_VALUE, 0.0f), 
                SValueDescription(ABSOLUTE_VALUE, 100.0f),
                SValueDescription(ABSOLUTE_VALUE, 0.0f), 
                SValueDescription(ABSOLUTE_VALUE, 0.0f));
transAnim->setDuration(1000);

// 将动画添加到集合
animSet->addAnimation(alphaAnim);
animSet->addAnimation(scaleAnim);
animSet->addAnimation(transAnim);

// 启动动画集合
animSet->start();

使用示例

基础动画可以通过 XML 或代码方式定义:

<!-- 在 XML 中定义动画 -->
<alpha duration="1000" fromAlpha="0.0" toAlpha="1.0" />
<rotate duration="500" fromDegrees="0" toDegrees="360" />
<translate duration="800" fromXDelta="0" toXDelta="100" />
<scale duration="600" fromXScale="1.0" toXScale="2.0" />
// 在代码中创建动画
SAlphaAnimation* alphaAnim = new SAlphaAnimation(0.0f, 1.0f);
alphaAnim->setDuration(1000);