当我尝试使用StateListDrawable时,我有一个非常奇怪的现象:

我有一个扩展了ImageView的 View ,我在其构造函数中使用了StateListDrawable
我有2个代码段来介绍我的问题。
第一个:

public class MyView extends ImageView{
Resources r = getResources();
Drawable filteredDrawable = r.getDrawable(R.drawable.smallsale);
filteredDrawable.setColorFilter(new LightingColorFilter(Color.RED, 1));
setImageDrawable(filteredDrawable);
}

第二个:
public class MyView extends ImageView{
Resources r = getResources();
Drawable filteredDrawable = r.getDrawable(R.drawable.smallsale);

filteredDrawable.setColorFilter(new LightingColorFilter(Color.RED, 1));

StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.state_pressed},  filteredDrawable);
states.addState(new int[] {android.R.attr.state_focused}, filteredDrawable);
states.addState(new int[] {}, r.getDrawable(R.drawable.smallsale));

//Notice I do not use 'states' at all...
setImageDrawable(filteredDrawable);

}

(我知道这段代码没有多大意义-我想简化问题以使问题更清楚)。问题是在第一个sinppet上一切正常-我在drawable上设置了一个滤色器,然后将其显示。但是在第二个 fragment 中,StateListDrawable实例对过滤器产生了某种影响,并且显示了原始可绘制对象,尽管我从未通过调用ImageView将其连接到setImageDrawable(states)

有人可以向我解释发生了什么吗?
我的目标是将StateListDrawable与相同的drawable用于不同的状态,如下所示:
StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.state_pressed},  filteredDrawable);
states.addState(new int[] {android.R.attr.state_focused}, filteredDrawable);
states.addState(new int[] {}, r.getDrawable(R.drawable.smallsale));
setImageDrawable(states);

(我需要通过代码执行此操作,因为我的drawable应该从网络中动态加载,而不是作为资源来加载)

最佳答案

好的。
我发现this post

原来StateListDrawables出于某种原因而松开了过滤器...
我采用了SnoK的解决方案,它对我来说非常有用。

我不知道为什么Google不认为应该在文档中注明它是副作用...

10-08 03:20