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:
- Animar elementos recién agregados en ListView
- Android - Animar el diálogo emergente con efecto de rebote
- Las animaciones personalizadas para iniciar actividades en Android no funcionan como se esperaba
- Android girar imageview, no puedo establecer la posición final de imageview en onAnimationEnd ()
- ¿Cómo reanudar y pausar ObjectAnimator en Android para niveles de API por debajo de 19?
<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?
- Android: ¿Cómo iniciar una animación infinita aplicada en un ImageView después de la actividad con la vista animada se ha reanudado?
- Establecer lista de animación de android por programación
- Fondo intermitente
- ¿Cómo hacer que la animación de GridView sea como en la aplicación de Google Keep?
- AnimatorSet con setStartDelay llama a onAnimationStart
- Transiciones de retorno de la actividad - Elementos compartidos - Actividad asesinada
- Animación de texto en lienzo - Android
- Animación de escala de Android en la vista
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:
- Incluya archivos .java como archivos de origen java en Android Studio para eliminar el círculo rojo con "J" en ellos
- Diferentes bibliotecas / importaciones dependiendo del tipo de construcción