NativeScript-Vue中如何实现动画暂停效果
AnimationSet暂停功能实现方案 自定义cancel()方法的可行性结论
不建议通过自定义cancel()逻辑实现暂停效果。
原生AnimationSet.cancel()的设计语义就是终止动画执行、清空动画任务队列、将绑定元素重置为动画启动前的初始状态,方法内部逻辑和动画帧调度、状态机流转强绑定,强行重写覆盖重置逻辑会打断内部状态同步,极易出现动画状态错乱、控件属性异常、内存泄漏、后续动画无法正常启动等问题,同时也会破坏cancel()方法本身的语义一致性,提升后续代码维护成本。
可落地的动画暂停实现方案
- 优先使用官方内置暂停/恢复API
Android 4.4(API 19)及以上版本中,AnimationSet已经原生提供了暂停、恢复能力,无需额外修改逻辑:- 需要暂停时直接调用
animationSet.pause() - 需要恢复时直接调用
animationSet.resume()
这两个方法会自动记录动画当前的执行进度、元素的实时变换属性,不会触发元素状态重置,完全符合暂停交互的需求。
- 需要暂停时直接调用
- 低版本兼容手动实现方案
如果项目需要兼容API 19以下的系统版本,可以通过手动记录状态的方式实现暂停:- 触发暂停时,遍历
AnimationSet下的所有子动画,记录每个动画已执行的时长占总时长的比例,同时捕获动画绑定元素当前的平移、缩放、旋转、透明度属性值 - 调用
cancel()终止当前动画执行,手动将元素的属性固定在刚才捕获的暂停点数值,阻止元素回到初始状态 - 触发恢复时,给每个子动画设置起始偏移,跳过已经执行过的时长,将元素起始属性设置为暂停点记录的数值,重新启动
AnimationSet即可接续之前的进度播放
- 触发暂停时,遍历
- 视图动画迁移到属性动画方案
如果你当前使用的是android.view.animation包下的旧版视图动画体系,长期来看建议直接迁移到android.animation包下的AnimatorSet+ObjectAnimator属性动画实现。属性动画从API 11开始就支持pause()/resume()方法,且动画属性直接作用于控件本身,不会出现视图动画常见的状态不同步、点击区域错位问题,稳定性更高。
注意:
cancel()方法的语义就是主动终止动画并回到初始态,不要为了实现暂停功能强行篡改该方法的默认逻辑,避免和系统内部动画调度逻辑产生冲突。
内容的提问来源于stack exchange,提问作者Derek Kuo
相关产品推荐
相关产品推荐

