【问题标题】:Android Lollipop - changes in Drawable's ColorFiltersAndroid Lollipop - Drawable 的 ColorFilters 的变化
【发布时间】:2015-01-28 09:53:34
【问题描述】:

在 Lollipop 设备上将 ColorFilter 与可绘制对象一起使用时,我遇到了一种奇怪的行为。

我正在尝试为整个应用程序更改某些可绘制对象的颜色。 我曾经通过在其上应用 ColorFilter 来做到这一点,然后当可绘制对象共享它们的 ConstantState 时,所有实例都被修改了。这在棒棒糖前设备上效果很好。但是,当在棒棒糖设备上运行时,这似乎被破坏了,修改只能应用于单个实例。 这是一个简单的例子,它在棒棒糖之前运行良好,而不是在棒棒糖之后:

int color = Color.BLUE;
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.ic_launcher);
addContentView(iv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

在棒棒糖之前的设备上,图像是蓝色的,在棒棒糖之后的设备上,图像是不变的。

这个例子对两者都有效,但只适用于该drawable的这个实例,而不是在其他地方重用它时:

int color = Color.BLUE;
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
ImageView iv = new ImageView(this);
iv.setImageDrawable(drawable);
addContentView(iv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));

据我了解,这可能与 Lollipop 应用其自己的 ColorFilter 的 Tint 效果有关,但此处的 ImageView 不可点击。所以我尝试在我的 drawable 上应用 setTint 方法但没有成功。

所以我的问题是在 Lollipop 版本中 drawables 的 constantState 上发生了什么,我怎样才能让我的 snipnet 再次工作?

谢谢。

【问题讨论】:

    标签: android drawable android-5.0-lollipop colorfilter


    【解决方案1】:

    对于 ImageView,您可以使用以下代码更改颜色:

    imgView.setColorFilter(iconColor, Mode.MULTIPLY);
    

    它适用于所有版本。

    【讨论】:

    • 嗨,Karn,感谢您的回复,但我不想更改单个 ImageView 的颜色。我希望像以前一样更改整个应用程序的可绘制颜色。换句话说,例如在一个新的Activity中使用相同的drawable时,颜色也应该是新的。
    猜你喜欢
    • 2015-01-05
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多