Estoy tratando de usar la transición de elementos compartidos en RecyclerView pero no parece funcionar.

Esta es una parte de mi adaptador en el que uso makeSceneTransitionAnimation():

public void onBindViewHolder(final BookViewHolder holder, final int position) {
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context, DetailsActivity.class);
                ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity)context , holder.smallThumbnail, "thumbnailTransition");
                context.startActivity(intent, optionsCompat.toBundle());
            }
        }
}
14
RandomyzeEverything 6 dic. 2016 a las 11:28
También agregue el código de su DetailsActivity
 – 
Manthan Patel
6 dic. 2016 a las 11:58
Puede ver este tutorial una vez github.com/codepath/android_guides/wiki /…
 – 
vinay Maneti
6 dic. 2016 a las 12:12
Parece ser el mismo código, excepto que se usa en una actividad y lo estoy usando en un adaptador.
 – 
RandomyzeEverything
6 dic. 2016 a las 12:50
No hay nada en DetailsActivity relacionado con las transiciones. Solo estoy mostrando un ImageView allí.
 – 
RandomyzeEverything
6 dic. 2016 a las 12:56

2 respuestas

La mejor respuesta

En su adaptador

holder.smallThumbnail.setTransitionName("thumbnailTransition");
Pair<View, String> pair1 = Pair.create((View) holder.smallThumbnail, holder.smallThumbnail.getTransitionName());

ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) mContext, pair1, pair2);
mContext.startActivity(intent, optionsCompat.toBundle());

En su actividad detallada

getWindow().setSharedElementEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.shared_element_transation));
mainImage.setTransitionName("thumbnailTransition");

Aquí, esta imagen principal es una vista de imagen en la que desea transformar la miniatura de su actividad anterior.

shared_element_transation crea un xml en res> transición

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500">
<changeBounds />
<fade />
</transitionSet>
18
Manthan Patel 22 dic. 2017 a las 10:24
Recibo una ClassCastException en (Activity) mContext que dice "La aplicación no se puede enviar a la actividad"
 – 
RandomyzeEverything
6 dic. 2016 a las 14:15
Use el contexto de la actividad puede ser que esté pasando el contexto de la aplicación al adaptador o la segunda forma es hacer la interfaz de devolución de llamada y hacer el código en la actividad
 – 
Manthan Patel
6 dic. 2016 a las 14:55
¿Cómo paso un contexto de actividad en lugar de un contexto de aplicación?
 – 
RandomyzeEverything
6 dic. 2016 a las 16:48
Insted de getApplicationContex () use ActvityName.this cuando pase el contexto al adaptador
 – 
Manthan Patel
6 dic. 2016 a las 16:49
9
¿Qué es el par2?
 – 
Kzaf
6 jul. 2019 a las 18:09

CON PICASSO

Adaptador

holder.smallImageView.setTransitionName("transition_name");
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(context, holder.smallImageView, "transition_name");

Intent intent = new Intent(context, DetailActivity.class);
context.startActivity(intent, optionsCompat.toBundle());

DetalleActividad

Picasso.with(context)
    .load(url)
    .into(bigImageView, new Callback() {
        @Override
        public void onSuccess() {
            bigImageView.setTransitionName("transition_name");
            getWindow().setSharedElementEnterTransition(TransitionInflater.from(context).inflateTransition(R.transition.shared_element_transition));
        }

        @Override
        public void onError() {

        }
    });

res / transición / shared_element_transition.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500">
    <changeBounds />
    <fade />
</transitionSet>
0
Yusuf Yaşar 17 jun. 2021 a las 18:16