Transición de elementos compartidos y Fresco no funcionan correctamente
Tengo dos Actividades, las cuales contienen una imagen. Estoy usando Fresco para cargar la imagen en una actividad y Picasso para cargar la imagen en otra actividad. Aquí están las partes relevantes de mi código:
Imagen en la primera actividad
- Cómo posicionar una vista fuera de la pantalla en el diseño de Android
- ¿Alguien sabe cómo usar onActivityReenter correctamente?
- Fragmento de elementos compartidos no funcionan con ViewPager
- `SetEnterTransition` sólo funciona con` ActivityCompat.startActivity`
- Iniciar Actividad de Fragmento utilizando Transición (soporte API 21)
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/imageView102" android:transitionName="image" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginLeft="9dp" android:layout_marginRight="9dp" android:layout_marginTop="10dp" fresco:actualImageScaleType="centerCrop" fresco:placeholderImage="@color/wait_color" fresco:placeholderImageScaleType="fitCenter" fresco:viewAspectRatio="1.33" android:layout_marginBottom="10dp" />
Imagen en segunda actividad
<uk.co.senab.photoview.PhotoView android:id="@+id/zoomable" android:transitionName="image" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" />
Estoy usando PhotoView en la segunda actividad para acercar y alejar la imagen.
Primera Actividad
Uri uri = Uri.parse(photoUrl); ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) .setProgressiveRenderingEnabled(true) .build(); DraweeController controller = Fresco.newDraweeControllerBuilder() .setImageRequest(request) .setOldController(image.getController()) .build(); image.setController(controller); image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(ImageActivity.this, AlternateFullImageActivity.class); intent.putExtra("ID", photoId); intent.putExtra("photoUrl", photoUrl); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ActivityOptionsCompat options = ActivityOptionsCompat. makeSceneTransitionAnimation(ImageActivity.this, (View)image, "image"); startActivity(intent, options.toBundle()); } else { startActivity(intent); } } });
Segunda actividad
Intent intent = getIntent(); photoId = intent.getExtras().getString("ID"); photoUrl = intent.getExtras().getString("photoUrl"); Picasso.with(AlternateFullImageActivity.this) .load(photoUrl) .into(image); mAttacher = new PhotoViewAttacher(image);
El problema es que la transición no es suave y muy rápida. He leído aquí que necesito cambiar la transición a ChangeBounds
. ¿Cómo cambio la transición a eso y cómo agrego la duración a esta transición como decir, 1000ms?
- Transición de actividad no realizada (Lollipop)
- ¿Cómo animar el botón de acción flotante mediante la transición de la actividad de Android?
- SharedElment transition usando fragmentos que no están en transición
- Transición de escena con elementos de héroe lanza Capa supera el máximo. Dimensiones soportadas por la GPU
- Transición de escena con elemento compartido anidado
- La transición de retorno no funciona correctamente cuando se utilizan fragmentos de transiciones compartidas
- Transición de elementos compartidos: actividad en fragmento anidado en otra actividad
- Elementos compartidos y transiciones de contenido en Fragmentos
Puede crear una clase que extienda TransitionSet para especificar las transiciones, como ChangeBounds. Por ejemplo…
@TargetApi(Build.VERSION_CODES.LOLLIPOP) public class DetailTransition extends TransitionSet { public DetailsTransition(int duration, int delay) { setOrdering(ORDERING_TOGETHER); addTransition(new ChangeBounds()). addTransition(new ChangeTransform()). addTransition(new ChangeImageTransform()).setDuration(duration).setStartDelay(delay).setInterpolator(new AnticipateOvershootInterpolator()); } }
Y luego establece la transición de elemento compartido en su fragmento o actividad / ventana. Para fragmentos como este
currentFragment.setSharedElementEnterTransition(new DetailsTransition(1000, 400));
O para actividades como esta
getWindow().setSharedElementEnterTransition(new DetailsTransition(1000, 400));
En las nuevas versiones de Fresco hay una transición personalizada para hacerlo fácilmente.
Mira este ejemplo en su propio repositorio:
https://github.com/facebook/fresco/tree/master/samples/transition
Básicamente, debe llamar a setSharedElementEnterTransition()
con la transición correspondiente en la actividad de apertura :
getWindow().setSharedElementEnterTransition(DraweeTransition.createTransitionSet(ScalingUtils.ScaleType.CENTER_CROP,ScalingUtils.ScaleType.FIT_CENTER)); getWindow().setSharedElementReturnTransition(DraweeTransition.createTransitionSet(ScalingUtils.ScaleType.FIT_CENTER,ScalingUtils.ScaleType.CENTER_CROP));
- Android instrumentación prueba java.lang.UnsatisfiedLinkError en el uso de AndroidJunitRunner y AndroidJUnit4
- Elemento en negrita después de la selección