Intereting Posts
Android – strings.xml против статических констант Скрытие элементов в списках должным образом Контролируемый элемент меню панели действий не работает / отображается правильно? Android: проблемы с анимацией edittext? Не удалось выполнить проверку подлинности Android Firebase: expired_token (токен аутентификации истек) Извлечение элемента из списка массивов в Android? Android Studio: Android-устройство не отображает мое устройство Если я объявляю фрагмент в XML-макете, как передать его Bundle? Как отправить электронную почту со ссылкой на приложение для Android Эмулятор Visual Studio для Android застрял в «OS is start …», только на уровне API 23 / Android 6 Панель инструментов – добавьте кнопку вверх Как получить направление компаса от азимута на Android Виджет minHeight = "72dp" дает 2 строки высоты Ошибка студии Android Эта библиотека поддержки не должна использовать более низкую версию (19) Margin внутри текста редактирования в android

Общая анимация элементов между элементом RecyclerView и CollapsingToolbar в пределах одной активности

В моем приложении у меня есть список элементов, отображаемых через адаптер RecyclerView . Если я нажимаю на элемент, новый Fragment запускается в пределах одного Activity . Макет моего элемента и моей активности выглядят (упрощены) следующим образом:

Схема работы:

 <android.support.design.widget.CoordinatorLayout> <android.support.design.widget.AppBarLayout> <android.support.design.widget.CollapsingToolbarLayout> <ImageView android:id="@+id/image" android:transitionName="image" ... /> <android.support.v7.widget.Toolbar ... /> </android.support.design.widget.CollapsingToolbarLayout> <android.support.design.widget.TabLayout ... /> </android.support.design.widget.AppBarLayout> <FrameLayout... /> </android.support.design.widget.CoordinatorLayout> 

Элемент макета:

 <RelativeLayout > <ImageView android:id="@id/itemImage" android:transitionName="image" /> <LinearLayout> <TextView ... /> <TextView ... /> </LinearLayout> </RelativeLayout> 

Теперь, если новый фрагмент запускается щелчком элемента, я хотел бы добавить анимацию изображения элемента в ImageView в CollapsingToolbarLayout . Я прочитал статью об анимации ShareElement, но здесь это не работает, потому что это не настоящая анимация ShareElement. Целевой ImageView не находится в новом фрагменте, ни я не должен запускать новое действие (я делаю только целевой ImageView видимым в новом Fragment ). Итак, как мне создать такую ​​анимацию в этом случае?

Solutions Collecting From Web of "Общая анимация элементов между элементом RecyclerView и CollapsingToolbar в пределах одной активности"

Итак, вы пытаетесь анимировать представление из одного макета в другое.

Я думаю, что это может быть достигнуто с помощью API ViewOverlays . Подробный ответ об этом API вы можете найти здесь .

Теперь в вашем случае, что вы в итоге получите, добавьте свой ImageView в ViewGroupOverlay корневого макета:

final ViewGroup container = (ViewGroup) findViewById(R.id.content); container.getOverlay().add(imageView); ...
final ViewGroup container = (ViewGroup) findViewById(R.id.content); container.getOverlay().add(imageView); ... 

Из документов :

Если представление имеет родителя, представление будет удалено из этого родителя перед добавлением в оверлей.

Таким образом, как только вы выполните getOverlay().add(imageView) представление будет удалено из его родителя. Теперь вы можете создать свою анимацию и перенести изображение в конечный пункт назначения.

final ViewGroup container = (ViewGroup) findViewById(R.id.content); container.getOverlay().add(imageView); // animate imageView by any API, eg ViewPropertyHolder imageView.animate() .x(finalX) .y(finalY) .setDuration(duration) .setInterpolator(interpolator) .withEndAction(() -> { // crucial point, remove the overlay container.getOverlay().remove(imageView); // add this `imageView` to the destination layout destLayout.addView(imageView); })
final ViewGroup container = (ViewGroup) findViewById(R.id.content); container.getOverlay().add(imageView); // animate imageView by any API, eg ViewPropertyHolder imageView.animate() .x(finalX) .y(finalY) .setDuration(duration) .setInterpolator(interpolator) .withEndAction(() -> { // crucial point, remove the overlay container.getOverlay().remove(imageView); // add this `imageView` to the destination layout destLayout.addView(imageView); }) 

Вот аналогичная функция, которую вы пытаетесь реализовать:

Введите описание изображения здесь