setColorFilter设置的颜色在prelollipop设备

时间:2017-03-23 17:03:54

标签: android

我有一个带有图标的TabLayout。想法是改变颜色运行时。 我有和xml可绘制文件的状态:state_pressed,state_selected和默认使用相同的白色图片,所以我可以稍后添加颜色。 我将抽签用于不同的状态:

Drawable [] drawables = stateListDrawable.getConstantState();

并为每个可绘制状态我从另一个数组中添加颜色:

drawables [i] .setColorFilter(colors [i],PorterDuff.Mode.MULTIPLY);

问题是颜色在开始时是可见的,但是当我开始点击图标时,所有图标再次变为白色并且我失去了色调。

棒棒糖及以上的一切都按预期工作。

2 个答案:

答案 0 :(得分:0)

使用v4支持库中的tint方法

drawables[i] = DrawableCompat.wrap(drawables[i])
DrawableCompat.setTint(drawables[i], colors[i])

答案 1 :(得分:0)

我找到了我的解决方案,它根本看起来并不干净,但至少它起作用了:)

我创建了CustomStateListDrawable,它从StateListDrawable扩展并添加了不同状态的drawable。然后我重写了类中的所有方法,看看哪些方法被调用并试图改变那里的颜色。被叫的时间足够晚了(我的更改在制作之后不会被覆盖)是getState()。我还创建了一个ColorStateList对象来保存我的颜色,所以代码看起来像这样:

       private ColorStateList colorStateList;


        public int[] getState() {
                if (colorStateList != null) {
                    // Resolve the color for the current state
                    int color = colorStateList.getColorForState(super.getState(), 0);
                    // Get the current drawable and changed its color. 
                    if (getCurrent() != null) {
                        getCurrent().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
                    }
                }
                return super.getState();
            }

基本上每当状态发生变化时,我都会得到当前可绘制的颜色并改变它的颜色。