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

Android中LottieAnimationView颜色断言测试问题求助

LottieAnimationView颜色设置的单元测试问题

我之前在Android应用里用ProgressBar时,用下面的测试代码校验视图颜色,完全正常:

assertEquals(
    ColorStateList.valueOf(
        Color.parseColor("#FF5500")
    ),
    activity
        .findViewById<ProgressBar?>(R.id.progress)
        .indeterminateTintList
)

后来把ProgressBar换成了LottieAnimationView:

<com.airbnb.lottie.LottieAnimationView
    android:id="@+id/progress"
    ...
    ...
</com.airbnb.lottie.LottieAnimationView>

原测试肯定跑不通,我改成了下面的代码:

assertEquals(
    ColorStateList.valueOf(
        Color.parseColor("#FF5500")
    ),
    activity
        .findViewById<LottieAnimationView?>(R.id.progress)
        .colorFilter
)

结果还是失败,报错:

Expected :ColorStateList{mStateSpecs=[[]]mColors=[-21999]mDefaultColor=-21999}
Actual   :null

我又试了用.solidColor替代.colorFilter,依旧失败:

Expected :ColorStateList{mStateSpecs=[[]]mColors=[-21999]mDefaultColor=-21999}
Actual   :0

实际代码里我是这么给Lottie设置颜色的:

lottieAnimationView.addValueCallback(
    new KeyPath("**"),
    LottieProperty.COLOR_FILTER,
    frInfo -> new PorterDuffColorFilter(
            myCustomViewColor,
            PorterDuff.Mode.SRC_ATOP
    )
);

但找不到对应的测试方法,有没有解决思路?


解决思路

核心原因

LottieAnimationView通过addValueCallback设置的颜色滤镜,并没有直接关联到View的colorFilter属性,也和solidColor不是同一个配置项,所以直接拿这两个属性断言肯定失败。要测试这种动态设置的回调,得从Lottie的回调机制入手。

具体测试步骤

  • 获取已设置的ValueCallback:用LottieAnimationView的getValueCallback方法,根据对应的KeyPath和LottieProperty拿到之前设置的回调实例。
  • 触发回调获取ColorFilter:构造一个FrameInfo实例(测试里用默认参数就行),传入回调的getValue方法,拿到返回的PorterDuffColorFilter。
  • 断言颜色和模式匹配:从ColorFilter里提取颜色值和混合模式,和预期值对比。

示例测试代码

// 获取Lottie视图
val lottieView = activity.findViewById<LottieAnimationView>(R.id.progress)

// 获取对应的颜色滤镜回调
val colorFilterCallback = lottieView.getValueCallback(KeyPath("**"), LottieProperty.COLOR_FILTER) as? LottieValueCallback<PorterDuffColorFilter>
// 先断言回调不为空
assertNotNull(colorFilterCallback)

// 构造FrameInfo触发回调
val frameInfo = FrameInfo(0, 0f, 0f, 0f, false)
val colorFilter = colorFilterCallback?.getValue(frameInfo)
assertNotNull(colorFilter)

// 提取颜色和模式进行断言
val expectedColor = Color.parseColor("#FF5500")
assertEquals(expectedColor, (colorFilter as PorterDuffColorFilter).color)
assertEquals(PorterDuff.Mode.SRC_ATOP, colorFilter.mode)

补充说明

如果你的KeyPath不是"**"(匹配所有元素),要换成实际设置时用的KeyPath;另外如果回调是用Java写的,测试里的类型转换要对应调整。

内容的提问来源于stack exchange,提问作者Sergio76

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:35:22