Android 设备处理滤色器的方式似乎有所不同

Android 设备处理滤色器的方式似乎有所不同,android,porter-duff,Android,Porter Duff,我有一个带有colorPrimary(红色)背景的按钮。在某些情况下,我必须在背景上应用颜色过滤器: myButton.getBackground().setColorFilter(getResources().getColor(R.color.background_grey),PorterDuff.Mode.SRC) 这是它应该的工作方式 我还需要能够撤销这个。我尝试了setColorFilter(null)和clearColorFilter()(它们依次调用setColorFilter(nu

我有一个带有
colorPrimary
(红色)背景的按钮。在某些情况下,我必须在背景上应用颜色过滤器:
myButton.getBackground().setColorFilter(getResources().getColor(R.color.background_grey),PorterDuff.Mode.SRC)
这是它应该的工作方式

我还需要能够撤销这个。我尝试了
setColorFilter(null)
clearColorFilter()
(它们依次调用
setColorFilter(null)
)。这在大多数设备上都能正常工作。但是,在某些设备上,按钮会变成白色而不是红色。点击该按钮似乎会将背景设置回红色(首先是
colorPrimaryDark
,然后返回到
colorPrimary

只有少数几个设备显示出这种行为,其中之一就是LG G3活力


有没有办法在任何设备上都做到这一点

你是说使用相同的通用源代码,并使用Android setColorFilter API?没有。很多设备在实现中都包含小错误,它们的行为可能会有所不同,我很惊讶你没有发现任何设备根本不会进行过滤(可能你最低的API要求足够高,可以避免这些)。但是,也许可以在setColorFilter(null)之后尝试一些类似invalidate()的方法,以完全重新绘制按钮?@Ped7g不幸的是,这不起作用:(顺便说一下,最小API级别是19。再试一次,尝试在setColorFilter(null)之后重新设置原始可绘制/颜色的整个背景?(我认为这样做会使invalidate()无效)在内部,但如果没有帮助,只需添加invalidate以确保它不起作用)你的意思是使用相同的通用源,并使用Android setColorFilter API?不。许多设备在实现中包含小错误,它们的行为可能会有所不同,我真的很惊讶你没有找到任何设备根本不会进行过滤(可能您的最低API要求已经足够高了,可以避免这些问题)。但是,在setColorFilter(null)之后尝试一些类似invalidate()的方法,以完全重新绘制按钮?@Ped7g不幸的是,这不起作用:(顺便提一下,最小API级别是19。再试一次,尝试在setColorFilter(null)之后重新设置)原始可绘制/颜色的整个背景?(我认为这将在内部执行invalidate(),但如果没有帮助,只需添加invalidate以确保它不起作用)