如何在Android UI测试中禁用自定义View的特定动画?
问题根因
系统全局动画缩放开关仅对系统过渡动画、原生属性动画生效,你自定义实现的补间动画逻辑没有主动适配系统缩放配置,所以即使关闭系统动画、通过TestRule修改了全局动画参数,动画仍然会正常播放。
可行解决方案
方案1:修改通用动画工具方法(最推荐,无业务侵入)
在你封装的run动画工具中新增系统动画缩放值判断,缩放为0时直接跳过动画执行,同时保留前后回调逻辑,不影响正常业务流程,生产环境也可适配用户手动关闭系统动画的场景。
修改后的代码如下:
import android.provider.Settings inline fun <reified T : View> run( view: T, @AnimRes anim: Int, crossinline beforeAnimation: (T) -> Unit = { _ -> }, crossinline afterAnimation: (T) -> Unit = { _ -> } ) { view.clearAnimation() // 读取系统动画缩放配置 val animScale = Settings.Global.getFloat( view.context.contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1f ) // 缩放为0时直接执行回调,跳过动画播放 if (animScale == 0f) { beforeAnimation(view) afterAnimation(view) return } // 原有动画逻辑保持不变 view.startAnimation( AnimationUtils.loadAnimation(view.context, anim).apply { setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) { beforeAnimation(view) } override fun onAnimationRepeat(animation: Animation?) {} override fun onAnimationEnd(animation: Animation?) { afterAnimation(view) } }) } ) }
你现有DisableAnimationsRule逻辑无需修改,测试运行时会自动将全局动画缩放设为0,触发动画跳过逻辑,测试结束后会自动恢复动画配置,不需要额外修改测试代码。
方案2:仅测试场景禁用(不想修改生产代码时使用)
如果不想改动生产环境的动画逻辑,可以在自定义View的动画启动逻辑中新增测试环境判断:
private fun startAnimation() { // 测试环境直接跳过动画,可通过BuildConfig变量或者自定义标记判断 if (isTesting) return if (!isAttachedToWindow || VISIBLE != visibility) return // 原有动画逻辑保持不变 }
也可以在测试侧通过Mockito的Spy能力拦截startAnimation方法,测试时直接调用业务回调逻辑,跳过动画执行。
内容的提问来源于stack exchange,提问作者K.Os
相关产品推荐
相关产品推荐

