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
相关产品推荐
相关产品推荐

