You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:36:05