15

Ich versuche, ein ImageView zu einer anderen Position zwischen zwei Aktivitäten in Android API Level 21 zu animieren. Da "MoveImage" in Android L Vorschau entfernt wurde, verwende ich "ChangeImageTransform" Stattdessen funktioniert der Beispielcode in Dokumenten nicht (die beiden Bilder werden separat animiert).Animiere ImageView zwischen zwei Aktivitäten mit gemeinsamen Elementübergängen mit ChangeImageTransform

<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> 

Gibt es ein funktionierendes Beispiel? Vielen Dank!

Antwort

28

Um eine Bildschirmübergangsanimation zwischen zwei Aktivitäten, die ein gemeinsames Element haben, Sie this article und folgen Sie den genannten Schritte lesen:

  1. aktivieren Fensterinhalt Übergänge in Ihrem Thema.
  2. Geben Sie einen Übergang für gemeinsam genutzte Elemente in Ihrem Stil an.
  3. Definieren Sie Ihren Übergang als XML-Ressource.
  4. Weisen Sie den freigegebenen Elementen in beiden Layouts einen gemeinsamen Namen mit dem Attribut android: transitionName zu.
  5. Verwenden Sie die ActivityOptions.makeSceneTransitionAnimation() -Methode.

über die 3. Stufe, nach den documentation:

In Kombination mit ChangeBounds ermöglicht ChangeImageTransform ImageViews, die Größe, Form oder ImageView.ScaleType Inhalt glatt zu animieren.

Der res/Übergang/your_transition.xml sollte wie folgt sein:

<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> 

oder einfach so, wenn nur IVa und IVb müssen animiert werden:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeBounds/> 
    <changeImageTransform/> 
</transitionSet> 
+0

Es funktioniert jetzt, danke! – iForests

+1

Ich habe versucht, dies zum Laufen zu bringen, aber die Eingabeübergabe für die neue Aktivität wird eingeblendet, wobei ImageView als letztes in der alten Aktivität angezeigt wird. Der Exit-Übergang funktioniert jedoch. –

+0

@TimmahhTimmahh Haben Sie alle Schritte im Dokument verfolgt? Bitte geben Sie weitere Informationen, danke :) –

8

ich habe Dies funktioniert nach dieser Anleitung, einigen anderen und dem referenzierten Material.

Ein Übergang in diesem Stil festgelegt. Ich setze das unter res/Übergang:

In der Quelle und Ziel ImageViews, müssen Sie ein Namensschild hinzufügen. Der Name muss gleich sein.

<ImageView 
... 
android:transitionName="MYTRANSITIONVIEW" 

/> 

In styles.xml fügen Sie der Anwendung Thema:

<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> 

ich dies in einem Fragment bin mit so beginne ich die neue Tätigkeit wie folgt aus:

Bundle bundle = null; 

if (activity != null) { 
    ActivityOptionsCompat options = 
       ActivityOptionsCompat.makeSceneTransitionAnimation(activity, Frag2_, "MYTRANSITIONVIEW"); 
    bundle = options.toBundle(); 
} 
activity.startActivity(i, bundle); 

Es funktioniert auf API 21 Clients. Es hat auf einem API 16-Client nicht funktioniert, da die XML-Tags nicht gültig sind.

Ich hoffe, das hilft.

leichte Aktualisierung, den umgekehrten Übergang auf Ausgang zu gelangen, musste ich

supportFinishAfterTransition(); 

statt finish() nennen;

+0

es sollte nicht res/Übergänge sein, sollte es res/Übergang sein :) –

+0

Sie haben natürlich Recht. Vielen Dank! – formica

+0

@formica Funktioniert es in API-Ebene 19? – Pei