Вместо попытки отменить изменения, внесенные в исходный фон RippleDrawable
, вы можете сохранить его и применить изменения к копии:
Пусть Activity
имеет два поля Drawable
:
private RippleDrawable customRippleDrawable;
private RippleDrawable backgroundFromXml;
Создайте копию данного фона и установите его в качестве нового фона:
Drawable background = view.getBackground();
if (Build.VERSION.SDK_INT >= 21 && background instanceof RippleDrawable) {
backgroundFromXml = (RippleDrawable) background;
customRippleDrawable = (RippleDrawable) background.getConstantState().newDrawable().mutate();
customRippleDrawable.setHotspot(x, y);
customRippleDrawable.setColor(new ColorStateList(
new int[][]{
new int[]{}
},
new int[]{
MainActivity.this.getResources().getColor(R.color.rippleColor)
}
));
customRippleDrawable.setState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled});
view.setBackground(customRippleDrawable);
}
Поскольку backgroundFromXml является полем, вы можете получить к нему доступ позжечтобы сбросить фон к его первоначальному значению:
view.setBackground(backgroundFromXml);
Что делает mutate()
?
Все Drawable
сгенерированные из одного извлекаемого ресурса имеют общее состояние.Это помогает экономить ресурсы (например, память) и, таким образом, повышает производительность приложения для Android.
Обычно, если вы примените, например, ColorFilter
к Drawable
, сгенерированному из определенного ресурса, который вы будете рисовать, вы будетеобратите внимание на эффект повсюду в вашем приложении, где используется этот конкретный нарисованный ресурс.
Вызов mutate()
на Drawable
сообщает среде выполнения, что этот Drawable
должен иметь свое собственное состояние.Если вы примените какие-либо изменения впоследствии, остальные Drawables останутся без изменений.
См. Также документацию на mutate()