首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android:克隆一个可绘制的,以便生成带有过滤器的StateListDrawable

Android:克隆一个可绘制的,以便生成带有过滤器的StateListDrawable
EN

Stack Overflow用户
提问于 2011-11-02 11:17:00
回答 7查看 29.5K关注 0票数 100

我试图使一个通用框架函数在pressed/focused/selected/etc.时突出显示任何可绘制的

我的函数接受一个可绘制并返回一个StateListDrawable,其中默认状态是可绘制的本身,而android.R.attr.state_pressed的状态是相同的可绘制的,只是使用setColorFilter应用了一个过滤器。

我的问题是,我不能克隆绘图,并在应用过滤器的情况下创建一个单独的实例。以下是我想要达到的目标:

代码语言:javascript
运行
复制
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添加可绘图时,它似乎失去了它的所有过滤器。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-02 12:53:56

尝试以下几点:

代码语言:javascript
运行
复制
Drawable clone = drawable.getConstantState().newDrawable();
票数 173
EN

Stack Overflow用户

发布于 2013-08-30 23:45:25

如果将筛选器/ etc应用于用getConstantState().newDrawable()创建的可绘图,则该可绘制的所有实例也将被更改,因为可绘制对象使用constantState作为缓存!

因此,如果使用颜色过滤器和newDrawable()对圆圈进行着色,则会更改所有圆圈的颜色。

如果希望在不影响其他实例的情况下使此可拖更新,则必须更改现有的常量状态。

代码语言:javascript
运行
复制
// 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()

票数 115
EN

Stack Overflow用户

发布于 2017-03-24 23:53:33

这才是对我有用的。

代码语言:javascript
运行
复制
Drawable clone = drawable.getConstantState().newDrawable().mutate();
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7979440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档