2015-05-26 5 views
1

У меня есть собственное изображение, которое должно иметь возможность устанавливать цвет значка программно или из макетов. Это работает.Пользовательский ImageView с colorFilter хранит один и тот же фильтр, если тот же drawable используется снова

Скажем, я использую белый значок на черном фоне.

Затем, если один и тот же значок можно вырезать в другом месте приложения и инвертировать цвета, черный значок на белом фоне. Тогда только значки, которые использовались до того, как они останутся в исходном цвете. И я не могу изменить его ни с макета, ни с программным обеспечением. Такая же активность, но разные фрагменты.

Это класс.

public class IconView extends ImageView { 

    public IconView(Context context) { 
     this(context, null); 
    } 

    public IconView(Context context, AttributeSet attrs) { 
     this(context, attrs, R.attr.iconViewStyle); 
    } 

    public IconView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.IconView, defStyle, 0); 
     int color = attributes.getColor(R.styleable.IconView_icon_color, Color.WHITE); 
     ColorFilter cf = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN); 
     if (getDrawable() != null) getDrawable().setColorFilter(cf); 
     attributes.recycle(); 
    } 

    public void setIconColor(int color) { 
     getDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN); 
    } 
} 

я делаю что-то неправильно, или может андроид повторного использования какого-то образом, что вводимый коэффициент, когда они нарисованы они остаются, что путь (кажется странным)!

+0

У меня тоже такое поведение, хотя я использую то же самое, что и в MenuItem и ImageView, я думаю, что это связано с кешем Android – HendraWD

+0

Точно! Проверьте принятый ответ на помощь! –

+0

Проблема заключается в том, что я использую MenuItem, а на MenuItem у нас нет .setColorFilter(), вместо этого мы используем MenuItem.getIcon(). SetColorFilter() – HendraWD

ответ

1

Вероятно, что Drawable кэшируется, поэтому фильтр повторно используется. Вместо getDrawable.setColorFilter, попробуйте this.setColorFilter, который должен установить фильтр на копию извлекаемого файла, который не используется совместно с другими экземплярами.

3

Я знаю, что другой ответ был выбран как правильный, но это звучит так, как будто у вас другая проблема с тем, что подразумевает ответ. Если вы используете одно и то же изображение (особенно, если оно принадлежит ресурсу) в рамках одного и того же действия, то все они будут изменены при применении цветового фильтра. Это связано с тем, что выходы из res неизменяемы и будут иметь одно и то же состояние. Чтобы этого избежать, используйте getDrawable().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN).

Документы для mutate() содержат дополнительную информацию об этом.

+0

Я протестировал его, и он работает, поскольку мой случай отличается от @ just_user, и я не могу использовать принятый ответ – HendraWD

Смежные вопросы