Elemento compartido animación entre RecyclerView elemento y CollapsingToolbar dentro de la misma actividad

En mi aplicación tengo una lista de elementos mostrados a través de un adaptador de RecyclerView . Si hago clic en un elemento, un nuevo Fragment inició dentro de la misma Activity . El diseño de mi elemento y mi aspecto de actividad (simplificado) como este:

Disposición de la actividad:

 <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> 

Disposición del artículo:

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

Ahora, si el nuevo fragmento es iniciado por un clic de elemento, me gustaría añadir una animación de la imagen del elemento a ImageView en el CollapsingToolbarLayout . He leído el artículo sobre las animaciones de ShareElement, pero esto no funciona aquí porque no es una animación real de ShareElement. El ImageView destino no está en el nuevo fragmento ni tengo que iniciar una nueva actividad (solo hago visible el ImageView destino en el nuevo Fragment ). Entonces, ¿cómo crearía una animación en este caso?

Por lo tanto, está intentando animar una vista de un diseño a otro.

Creo que esto se puede lograr con ViewOverlays API . Puedes ver una respuesta detallada sobre esa API aquí .

Ahora, en su caso, lo que acabará con es agregar el ImageView al ViewGroupOverlay del diseño raíz:

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

De los documentos :

Si la vista tiene un padre, la vista se eliminará de ese padre antes de añadirla a la superposición.

Así, tan pronto como realice getOverlay().add(imageView) la vista sería eliminada de su padre. Ahora eres libre de crear tu animación y mover el imageView al destino final.

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); }) 

Esta es una característica similar que está intentando implementar:

Introduzca aquí la descripción de la imagen

  • Android 2.3: Crecer / reducir el error de animación?
  • Cómo establecer ninguna animación para la primera vista de ViewFlipper
  • Imagen de Android se desvanece animación
  • Velocímetro Android (indicador de aguja)
  • Efecto de desplazamiento con múltiples visualizadores
  • Actividad de visualización de abajo hacia arriba
  • Animación de fondo en Android?
  • Android anima una lista de animación
  • Android ViewPropertyAnimator no se escala al mismo tiempo
  • Android: anima el alfa de la única ruta en un lienzo
  • Animación de una imagen con ImageView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.