Transición personalizada de elementos compartidos en la actividad final
Tengo una lista de datos de feed en la aplicación global. He utilizado este código para hacer una transición de mi RecyclerView
en MainAcitivty
// selected item event Intent intent = new Intent(this, DetailActivity.class); intent.putExtra("item_feed_index", selectedItemIndex); FeedViewHolder viewHolder = getViewHolderFromPosition(position); Pair<View, String> pair1 = Pair.create(viewHolder.imageView, "TransitionName.Feed.Image"); Pair<View, String> pair2 = Pair.create(viewHolder.textView, "TransitionName.Feed.Text"); Pair<View, String> pair3 = Pair.create(viewHolder.button, "TransitionName.Feed.Button"); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pair1, pair2, pair3); startActivity(intent, options.toBundle());
Funciona. Pero el problema es que en DetailActivity
, tengo otra lista vertical, que el usuario puede desplazarse hacia abajo / arriba para cambiar el elemento Feed en la lista (que cambia el índice de desplazamiento también).
- Retener el efecto de ondulación durante la notificación
- Deslice RecyclerVista arriba mientras lo desliza hacia arriba, o deslice la vista de reciclaje hacia abajo mientras desliza hacia abajo
- RecyclerView sin barra de desplazamiento cuando se desactiva el desplazamiento excesivo
- Efecto de ondulación sobre un elemento de RecyclerView que contiene ImageView
- Cómo puedo crear un RecyclerView con una imagen de tamaño fijo que envuelva el contenido y la imagen centrada en el cultivo
Cuando presione de regreso de DetailActivity
, quiero que la transición de animación de salida se ejecute en el índice de alimentación de visualización correcto. ¿Cómo puedo hacer eso?
Este es el código onActivityResult
en MainActivity
, desplaza el reciclo a la posición correcta, pero la animación de transición de salida no es la posición correcta.
int currentFeedIndex = Application.getInstance().getCurrentViewingFeed(); if (currentFeedIndex > 0 && currentFeedIndex < adapter.getItemCount()) { if (gridLayoutManager != null) { gridLayoutManager.scrollToPositionWithOffset(currentFeedIndex + 1, 0); } }
Estoy buscando la manera de cambiar la lista de parejas antes de ejecutar la animación de salida
Actualización : aquí está el diseño de DetailActivity, donde asigno nombres de transición a vistas
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imgFeed" android:layout_width="match_parent" android:layout_height="match_parent" android:transitionName="TransitionName.Feed.Image" /> <TextView android:id="@+id/tvLogo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:transitionName="TransitionName.Feed.Text"/> <Button android:transitionName="TransitionName.Feed.Button" android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:layout_below="@+id/tvLogo"/> </RelativeLayout>
- RecyclerView se bloquea al desplazarse
- RecyclerView, StaggeredGridLayoutManager Actualizar el error
- Animar bot / parte inferior de la vista viola desplazamiento en recyclerView
- NestedScrollView y Horizontal RecyclerView Smooth Scrolling
- Cómo ampliar el espacio entre RecyclerView Item mientras se desplaza
- Desplazamiento del foco de RecyclerView
- Al hacer clic en ActionButton flotante en la esquina derecha, se hace clic en el elemento RecyclerView
- ¿Las mejores prácticas para usar el reino con una vista de reciclador?
Actividad de la persona que llama:
String itemId; //set your item id here Intent intent = new Intent(this, DetailActivity.class); intent.putExtra("item_feed_index", selectedItemIndex); intent.putExtra("item_id", itemId); String imageViewTransitionName = "TransitionName.Feed.Image." + itemId; String textViewTransitionName = "TransitionName.Feed.Text." + itemId; String buttonTransitionName = "TransitionName.Feed.Button." + itemId; ViewCompat.setTransitionName(viewHolder.imageView, imageViewTransitionName); ViewCompat.setTransitionName(viewHolder.textView, textViewTransitionName); ViewCompat.setTransitionName(viewHolder.button, buttonTransitionName); Pair<View, String> pair1 = Pair.create(viewHolder.imageView, imageViewTransitionName); Pair<View, String> pair2 = Pair.create(viewHolder.textView, textViewTransitionName); Pair<View, String> pair3 = Pair.create(viewHolder.button, buttonTransitionName); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pair1, pair2, pair3); startActivity(intent, options.toBundle());
A continuación, en su Activity
destino sólo necesita obtener itemId
de Intent
y establecer el nombre de transición correcto para cada vista.
String itemId = getIntent().getString("item_id"); String imageViewTransitionName = "TransitionName.Feed.Image." + itemId; String textViewTransitionName = "TransitionName.Feed.Text." + itemId; String buttonTransitionName = "TransitionName.Feed.Button." + itemId; ViewCompat.setTransitionName(findViewById(R.id.imageView), imageViewTransitionName); ViewCompat.setTransitionName(findViewById(R.id.textView), textViewTransitionName); ViewCompat.setTransitionName(findViewById(R.id.button), buttonTransitionName);
onBackPressed
método onBackPressed
en su DetailActivity de la siguiente manera:
@Override public void onBackPressed() { supportFinishAfterTransition(); super.onBackPressed(); }
Además, asegúrese de haber especificado la transición de salida en sus styles.xml
- Optimización de los efectos de partículas para teléfonos más lentos
- ¿Necesito solicitar actualizaciones de ubicación al utilizar Geofences de ubicación fusionada?