11

Je travaille sur une démonstration de faisabilité dans laquelle j'ai quelques vues personnalisées dans une TableLayout. Lorsque l'un des affichages est cliqué, je veux animer la vue en expansion dans une nouvelle activité. L'effet que je veux atteindre est similaire à ce que l'on voit here. D'après mes recherches, il semblerait que la façon de procéder soit shared element Transitions. Cependant, je ne peux pas le faire fonctionner correctement et je me demande si c'est parce que j'utilise mon propre View personnalisé. Plus précisément, les fondus se produisent, mais les mouvements de mise à l'échelle et de translation ne le sont pas. Vérifiez le GIF ci-dessous pour voir où je suis. Dans l'exemple, je clique sur le cercle supérieur gauche, que je veux transformer en cercle complet dans la nouvelle activité. Le problème peut également être vu lorsque le bouton de retour est pressé.Utilisation des transitions d'activité SharedElement avec une vue personnalisée

enter image description here

je crois qu'il est incorrect parce que la vue doit être établi, mais est-il un moyen de personnaliser mon point de vue plus pour faire ce travail? Tous les exemples que j'ai trouvés de ce type de transition ont consisté en ImageViews, Boutons et TextViews.

Vous trouverez ci-dessous la source appropriée. Ma vue personnalisée est grande et ne contient aucun code spécial, elle remplace simplement onDraw() et onMeasure().

MainActivity.java

package com.rscottcarson.circleschedulertest; 

import android.app.Activity; 
import android.app.ActivityOptions; 
import android.content.Intent; 
import android.support.v4.app.ActivityOptionsCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 
import android.widget.Toast; 
public class MainActivity extends Activity { 

    private View view1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     view1 = findViewById(R.id.circle1); 

     view1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Intent intent = new Intent(MainActivity.this, DetailActivity.class); 
       // create the transition animation - the images in the layouts 
       // of both activities are defined with android:transitionName="profile" 
       ActivityOptions options = ActivityOptions 
         .makeSceneTransitionAnimation(MainActivity.this, view1, "profile"); 
       // start the new activity 
       startActivity(intent, options.toBundle()); 
      } 
     }); 

    } 
} 

DetailActivity.java

package com.rscottcarson.circleschedulertest; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 

public class DetailActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_detail); 

    } 
} 

change_image_trans.xml

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeTransform /> 
</transitionSet> 

styles.xml

<resources> 

    <!-- Base application theme. --> 
    <style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar"> 
     <item name="android:windowActivityTransitions">true</item> 
     <item name="android:windowContentTransitions">true</item> 

     <!-- Customize your theme here. --> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 


     <!-- specify shared element transitions --> 
     <item name="android:windowSharedElementEnterTransition"> 
      @transition/change_image_trans</item> 
     <!-- specify shared element transitions --> 
     <item name="android:windowSharedElementExitTransition"> 
      @transition/change_image_trans</item> 
    </style> 

</resources> 

Répondre

3

Juste essayer avec postponeEnterTransition() et startPostponedEnterTransition() dans votre DetailActivity

postponeEnterTransition() utilisé pour retarder temporairement la transition jusqu'à ce que les éléments partagés ont été correctement mesurés et disposés.

startPostponedEnterTransition() Planifie la transition d'éléments partagés à démarrer immédiatement après la mesure et la disposition de l'élément partagé dans la hiérarchie de vue de l'activité.

DetailActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_detail); 
    postponeEnterTransition(); 
} 

private void scheduleStartPostponedTransition(final View sharedElement) { 
    sharedElement.getViewTreeObserver().addOnPreDrawListener(
     new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       sharedElement.getViewTreeObserver().removeOnPreDrawListener(this); 
       startPostponedEnterTransition(); 
       return true; 
      } 
     }); 
} 
0

Je ne pense pas que votre problème est que vous avez une vue personnalisée ... Je fais toujours ces transitions avec mes vues personnalisées et ils fonctionnent bien.

je peux voir que ce code:

ActivityOptions options = ActivityOptions 
         .makeSceneTransitionAnimation(MainActivity.this, view1, "profile"); 
       // start the new activity 
       startActivity(intent, options.toBundle()); 

does't faire ce que vous voulez.

Voici ce que vous devez faire:

First, créez votre xml avec la transition:

Première activité

<YouCustomView 
    android:id="@+id/someId" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:transitionName="@string/someTransition"> 

Deuxième activité:

<YouCustomView 
     android:id="@+id/someOtherId" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:transitionName="@string/someTransition"> 

Deuxième, lorsque vous vous démarrez votre deuxième activité, le faire comme ceci:

 ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(
    this, new Pair<>(findViewById(R.id.someId), getString(R.string.someTransition)) 

startActivity(intent, activityOptions.toBundle()); 

Vous avez oublié d'ajouter la paire avec la vue et le nom de la transition. Ajoutez cela et votre transition fonctionnera très bien. Le fait que votre vue soit une vue personnalisée ne modifie pas l'animation.

Bonne codification!