我正在尝试在屏幕上定期闪烁不同颜色(每秒几次)。
为了改变颜色,我在主视图的背景上使用 Drawable.setColorFilter(int color, Mode mode)
:
myView.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.SRC);
出于调试目的,我添加了另一个视图,使用 View.setBackgroundColor(int color)
进行更改。
问题是,setColorFilter()
调用在 Lollipop 上运行正常,但在 早期版本(特别是 Nexus 7 v4.4.4、Galaxy Nexus v4.2.1)上出现问题。
我在一个 Handler
中触发一个 Runnable
来调用颜色更改代码。
无论在哪个平台上,处理程序都会被调用(我可以通过调试中的 setBackgroundColor()
调用看到背景更改)。
以下是变换颜色的代码:
Handler mHandler;
RunnableOnTick thisRunnable;
View vDebug;
View vBroken;
class RunnableOnTick implements Runnable
{
int backgroundColor;
@Override
public void run()
{
color = random.nextInt(2);
switch (color)
{
case 0:
{
backgroundColor = Color.RED;
break;
}
case 1:
{
backgroundColor = Color.GREEN;
break;
}
}
// this works on all platforms
vDebug.setBackgroundColor(backgroundColor);
// this works only on Lollipop
vBroken.getBackground().setColorFilter(backgroundColor, PorterDuff.Mode.SRC);
vBroken.invalidate();
mHandler.postDelayed(thisRunnable, 100);
}
}
我尝试了不同的PorterDuff.Mode
值 - 但在Android 4上无法使其正常工作。
在Android v4和v5之间有什么不同会影响setColorFilter()
的工作方式?
BitmapDrawable
。嗯,如果你不再拥有这个应用程序了,那么现在很难找到问题。我可以肯定地说,在 KitKat 中颜色过滤器是起作用的(你可以简单尝试使用ImageView
的tint
属性 - 它由 ColorFilter 支持)。 - Dmitry Zaytsev