将 ColorFilter 应用于 LayerDrawable 内的 Drawable

Posted

技术标签:

【中文标题】将 ColorFilter 应用于 LayerDrawable 内的 Drawable【英文标题】:Apply ColorFilter to a Drawable inside a LayerDrawable 【发布时间】:2014-05-02 04:42:07 【问题描述】:

我想在我的游戏中同时显示两辆不同颜色的汽车(比如说红色和蓝色),为此我使用相同的LayerDrawable(设置为@987654322 的图像资源@) 两辆车:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/car_backstuff"/>
    <item android:drawable="@drawable/car_body"/>
    <item android:drawable="@drawable/car_frontstuff"/>
</layer-list>

问题是,当我想给汽车上色时,我是这样做的:

_layerDrawable.getDrawable(1).setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);_

但是当我为第二辆车这样做时(即使用Color.BLUE两辆车都变成蓝色!

我知道这是因为它引用了相同的资源(在这种情况下为 R.drawable.car_body),但我想知道是否有办法为每辆车应用不同的 ColorFilter,例如在顶部插入另一层车身和乘以它还是什么?

【问题讨论】:

@Hamid Shatu 而不是只编辑我的帖子.. 你能回答吗?甚至尝试? @Vyger 是的,你是对的,我并没有假装他知道解决方案,但是“刚刚编辑了你的问题,抱歉无法回答”就足够了,但没关系。考虑到答案,我正在考虑“改变”颜色Drawable,这样好吗? @Der Golem,这对我有用,虽然感觉有点笨拙。我可以让我的drawable改变颜色,但它的尺寸也在改变,我想是因为它是一个插图内的形状。因此,在这种情况下,每种颜色都有一个单独的图层列表。 【参考方案1】:

我回答我自己的问题:

解决方案是为LayerDrawable 调用mutate(),然后对其中的Drawable 进行任何更改都不会影响到使用相同资源的另一个,这很神奇!

【讨论】:

以上是关于将 ColorFilter 应用于 LayerDrawable 内的 Drawable的主要内容,如果未能解决你的问题,请参考以下文章

Paint的ColorFilter

在android 5上设置ImageView colorFilter(api 21)

Android Paint之ColorFilter详解

Android Paint以及ColorFilter等

菜单项。 ColorFilter。圆形背景

Android ColorFilter and Tint