我试图使一个通用框架函数在pressed/focused/selected/etc.时突出显示任何可绘制的
我的函数接受一个可绘制并返回一个StateListDrawable,其中默认状态是可绘制的本身,而android.R.attr.state_pressed
的状态是相同的可绘制的,只是使用setColorFilter
应用了一个过滤器。
我的问题是,我不能克隆绘图,并在应用过滤器的情况下创建一个单独的实例。以下是我想要达到的目标:
StateListDrawable makeHighlightable(Drawable drawable)
{
StateListDrawable res = new StateListDrawable();
Drawable clone = drawable.clone(); // how do I do this??
clone.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
res.addState(new int[] {android.R.attr.state_pressed}, clone);
res.addState(new int[] { }, drawable);
return res;
}
如果我不克隆,那么过滤器显然适用于这两种状态。我试着和mutate()
玩,但没什么用.
有什么想法吗?
更新:
这个被接受的答案确实复制了一个可拖的。但是,它并没有帮助我,因为我的一般功能在另一个问题上失败了。当您向StateList添加可绘图时,它似乎失去了它的所有过滤器。
发布于 2011-11-02 12:53:56
尝试以下几点:
Drawable clone = drawable.getConstantState().newDrawable();
发布于 2013-08-30 23:45:25
如果将筛选器/ etc应用于用getConstantState().newDrawable()
创建的可绘图,则该可绘制的所有实例也将被更改,因为可绘制对象使用constantState
作为缓存!
因此,如果使用颜色过滤器和newDrawable()
对圆圈进行着色,则会更改所有圆圈的颜色。
如果希望在不影响其他实例的情况下使此可拖更新,则必须更改现有的常量状态。
// To make a drawable use a separate constant state
drawable.mutate()
如需更好的解释,请参阅:
http://www.curious-creature.org/2009/05/02/drawable-mutations/
http://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate()
发布于 2017-03-24 23:53:33
这才是对我有用的。
Drawable clone = drawable.getConstantState().newDrawable().mutate();
https://stackoverflow.com/questions/7979440
复制相似问题