Android:克隆可绘制对象以使用过滤器制作 StateListDrawable

标签 android android-widget drawable

我正在尝试制作一个通用框架函数,当按下/聚焦/选择/等时,使任何 Drawable 都高亮显示。

我的函数接受一个 Drawable 并返回一个 StateListDrawable,其中默认状态是 Drawable 本身,并且 android.R.attr.state_pressed 的状态是相同的 drawable,只是应用了一个过滤器使用 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() 但它没有帮助..

有什么想法吗?

更新:

接受的答案确实克隆了一个drawable。但它并没有帮助我,因为我的一般功能在另一个问题上失败了。似乎当您将可绘制对象添加到 StateList 时,它会丢失所有过滤器。

最佳答案

尝试以下方法:

Drawable clone = drawable.getConstantState().newDrawable();

关于Android:克隆可绘制对象以使用过滤器制作 StateListDrawable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7979440/

相关文章:

android - 将字符串保存到内部存储器然后显示它

android - 如何通过小部件按钮触发某些内容?

android - 如何设置 Bottom Sheet peek height 最初只显示某些部分?

java - Gradle 构建因 "Error:Execution failed for task ' :app:mergeDebugResources'. > Crunching Cruncher photo.png 失败而失败”

android - 有没有办法指定设备应该使用哪个可绘制文件夹?

android - 如何使动画过渡android

Android - 什么是布局管理器?

android - AnimationDrawable 不播放

java - 用按钮错误链接两个 Java Activity ! "Android Studio"

android - Cardview - 为每个元素设置不同的背景颜色