Как изменить анимацию, используемую механизмом animateLayoutChanges?

У меня есть RecyclerView в котором пользователь выбирает элемент. При выборе определенного вида становится видимым перед текстом (см. Изображение). Я хочу оживить его внешний вид.

Графическое представление

animateLayoutChanges на макете элементов отлично работает, за исключением типа анимации для внешнего вида - он исчезает. Я хочу, чтобы он масштабировался от 0 до 100%, я считаю, что он называется "всплывающей" анимацией.

Если я animateLayoutChanges и использую XML-анимацию для этого, он работает, но соседний текст больше не анимируется (он должен скользить, чтобы разместить пространство для представления и его поля). Он мгновенно перемещается вправо, а затем воспроизводится анимация. Это хуже с обратной анимацией, так как текст перекрывает представление перед его исчезновением.

Поэтому мне нужно как-то комбинировать механизм по умолчанию и мою собственную анимацию. Каким будет самый простой способ добиться этого, не вникая в пользовательскую анимацию?

Ответы

Ответ 1

После долгих копаний в неправильных местах нашел ответ сам. Может помочь кому-то.

animateLayoutChanges если включено, использует экземпляр LayoutTransition для выполнения своей работы в ViewGroup.

Поэтому, чтобы изменить анимацию, вы можете создать экземпляр LayoutTransition, установить Animator для перехода, который вам нужно изменить, а затем назначить этот экземпляр ViewGroup помощью setLayoutTransition().

В моем случае результат:

Animator scaleDown = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 1, 0), PropertyValuesHolder.ofFloat("scaleY", 1, 0));
scaleDown.setDuration(300);
scaleDown.setInterpolator(new OvershootInterpolator());

Animator scaleUp = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 0, 1), PropertyValuesHolder.ofFloat("scaleY", 0, 1));
scaleUp.setDuration(300);
scaleUp.setStartDelay(300);
scaleUp.setInterpolator(new OvershootInterpolator());

LayoutTransition itemLayoutTransition = new LayoutTransition();
itemLayoutTransition.setAnimator(LayoutTransition.APPEARING, scaleUp);
itemLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, scaleDown);

ViewGroup av = (ViewGroup)v.findViewById(R.id.animated_layout);
av.setLayoutTransition(itemLayoutTransition);

Дополнительная информация в справочной документации LayoutTransition.