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);