J'essaie d'animer une ImageView à une autre position entre deux activités dans Android API level 21. Puisque "MoveImage" dans Android L Preview a été supprimé, je utilisez plutôt " ChangeImageTransform ", mais l'exemple de code dans les documents ne fonctionne pas (les deux images sont animées séparément).
<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
<changeImageTransform>
<targets>
<target Android:targetId="@id/ivA" />
<target Android:targetId="@id/ivB" />
</targets>
</changeImageTransform>
</transitionSet>
Y a-t-il un exemple de travail? Merci!
Pour faire une animation de transition d'écran entre deux activités qui ont un élément partagé, vous pouvez lire cet article et suivre les étapes mentionnées:
- Activez les transitions de contenu de fenêtre dans votre thème.
- Spécifiez une transition des éléments partagés dans votre style.
- Définissez votre transition en tant que ressource XML.
- Attribuez un nom commun aux éléments partagés dans les deux présentations avec l'attribut Android: transitionName.
- Utilisez la méthode ActivityOptions.makeSceneTransitionAnimation ().
A propos de la 3ème étape, selon la documentation :
En combinaison avec ChangeBounds, ChangeImageTransform permet à ImageViews qui modifient la taille, la forme ou ImageView.ScaleType d'animer le contenu en douceur.
Le fichier res/transition/your_transition.xml devrait ressembler à ceci:
<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
<changeBounds>
<targets>
<target Android:targetId="@id/ivA" />
<target Android:targetId="@id/ivB" />
</targets>
</changeBounds>
<changeImageTransform>
<targets>
<target Android:targetId="@id/ivA" />
<target Android:targetId="@id/ivB" />
</targets>
</changeImageTransform>
</transitionSet>
ou tout simplement comme ça si seuls ivA et ivB doivent être animés:
<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
<changeBounds/>
<changeImageTransform/>
</transitionSet>
J'ai ce travail en suivant ce guide, quelques autres et le matériel référencé.
Une transition dans ce style. Je mets ceci sous res/transition:
<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
<changeBounds>
<targets>
<target Android:targetId="@id/ivA" />
<target Android:targetId="@id/ivB" />
</targets>
</changeBounds>
<changeImageTransform>
<targets>
<target Android:targetId="@id/ivA" />
<target Android:targetId="@id/ivB" />
</targets>
</changeImageTransform>
</transitionSet>
Dans les ImageViews source et cible, vous devez ajouter une étiquette de nom. Le nom doit être le même.
<ImageView
...
Android:transitionName="MYTRANSITIONVIEW"
/>
Dans styles.xml, ajoutez au thème d'application:
<item name="Android:windowContentTransitions">true</item>
<item name="Android:windowActivityTransitions">true</item>
<item name="Android:windowSharedElementEnterTransition">@transition/my_transition</item>
<item name="Android:windowSharedElementExitTransition">@transition/my_transition</item>
J'exécute cela à l'intérieur d'un fragment, donc je commence la nouvelle activité comme ceci:
Bundle bundle = null;
if (activity != null) {
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(activity, Frag2_, "MYTRANSITIONVIEW");
bundle = options.toBundle();
}
activity.startActivity(i, bundle);
Il fonctionne sur les clients API 21. Cela ne fonctionnait pas sur un client API 16 car les balises XML ne sont pas valides.
J'espère que ça aide.
Légère mise à jour, pour obtenir la transition inverse à la sortie, j'ai dû appeler
supportFinishAfterTransition();
plutôt que de terminer ();