【发布时间】:2017-12-01 00:38:53
【问题描述】:
我正在尝试定期(每秒几次)在屏幕上闪烁不同的颜色。
要更改颜色,我在主视图的背景上使用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)。
我在Runnable 中调用颜色更改代码,该代码由Handler 定期触发。
处理程序在所有平台上都被调用(我可以看到由于调试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() 的工作方式?
【问题讨论】:
-
您使用的是哪个
Drawable?这可能取决于特定的实现。 -
@Dmitry 如果我没记错的话,我只是使用库存的绿色 android 启动器图标,因为这是我拼凑的概念验证。最后我用了另一种方法,几个月没看那个应用了。
-
然后是
BitmapDrawable。好吧,如果您不再拥有该应用程序,那么现在很难找到问题所在。我可以肯定地说颜色过滤器在 KitKat 中工作(你可以简单地尝试使用ImageView的tint属性 - 它由 ColorFilter 支持) -
@Dmitry 我会看看我能拿出什么回购。我总是很想知道这个错误是否在我身上,一个经过良好测试的框架。还将测试提供的答案代码和评论。感谢您的意见。
-
@Richard 试试下面的方法
标签: android android-5.0-lollipop android-4.0-ice-cream-sandwich