2015-10-31 18 views
5

Ho due attività con un singolo oggetto condiviso, un ImageView. Entrambe le attività sono sottoclassi di AppCompatActivity e condividono lo stesso tema:onEnterAnimationComplete() non viene chiamato dopo una transazione di attività

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="android:windowActionBar">false</item> 
    <item name="android:windowContentTransitions">true</item> 
    <item name="android:windowTranslucentStatus">false</item> 
    <item name="android:windowExitTransition">@transition/transition_slide</item> 
    <item name="android:windowEnterTransition">@transition/transition_slide</item> 
    <!-- specify shared element transitions --> 
    <item name="android:windowSharedElementEnterTransition"> 
     @transition/obj_transition</item> 
    <item name="android:windowSharedElementExitTransition"> 
     @transition/obj_transition</item> 
</style> 

Attività A chiama Attività B nel modo seguente:

Intent intent = new Intent(ActivityA.this, ActivityB.class); 
ActivityOptionsCompat options = ActivityOptionsCompat 
    .makeSceneTransitionAnimation(ActivityA.this, view, "common_tag"); 
ActivityCompat 
    .startActivityForResult(ActivityA.this, intent, ACT_B_TAG, options.toBundle()); 

durante l'attività B, voglio iniziare una semplice animazione oscillazione su lo stesso ImageView condiviso. Se avvio l'animazione sul metodo onCreate, il risultato è abbastanza brutto perché inizia prima della alla fine della transizione di attività. Così ho sovrascrivere il metodo di onEnterAnimationComplete() in attività B:

@Override 
public void onEnterAnimationComplete() { 
    Log.d(TAG, "ANIMATION COMPLETE"); 
    Animation anim = AnimationUtils.loadAnimation(this, R.anim.wobble); 
    findViewById(R.id.SharedView).startAnimation(anim); 
} 

Il problema è, non succede nulla. Le transizioni di attività e elementi condivisi vengono riprodotte, ma al termine dell'altra l'animazione non verrà avviata. Controllando l'output del logcat vedo che il metodo non è nemmeno chiamato. qualche idea?

risposta

0

C'è una soluzione alternativa per questo. Puoi posticipare la transizione di inserimento attività, aggiungere un listener preDraw all'immagine (o qualsiasi altra cosa, dipende da te), configurare le animazioni e quindi avviare la transizione di inserimento posticipata.

postponeEnterTransition(); // wait until all animations are set up 
imageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       imageView.getViewTreeObserver().removeOnPreDrawListener(this); // only run once 
       enterAnimation(); // your animations here 
       startPostponedEnterTransition(); // all animations are ran 

       return true; 
      } 
     }); 

Non so se onEnterAnimationComplete() non sempre chiamato è destinato comportamento, ma se è allora questo è un grande svista da parte del team quadro.

+0

questa sembra essere una questione rilevante SO. http://stackoverflow.com/questions/39488410/onenteranimationcomplete-not-called-api-21 – Kiki

0

Ho testato il codice e funziona perfettamente.

Aggiungere un pulsante a MainActivity per navigare a ActivityB.

public class MainActivity extends AppCompatActivity { 

private Button button; 

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

    button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(getApplicationContext(), ActivityB.class); 
      startActivity(intent); 
     } 
    }); 
} 

Override Animazione di ActivityB per comprendere correttamente

public class ActivityB extends AppCompatActivity { 

private TextView textView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    overridePendingTransition(R.anim.slide_in_up, R.anim.still); 
    setContentView(R.layout.activity_b); 

    textView = (TextView) findViewById(R.id.textView); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    overridePendingTransition(R.anim.still, R.anim.slide_out_down); 
} 

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    overridePendingTransition(R.anim.still, R.anim.slide_out_down); 
} 

@Override 
public void onEnterAnimationComplete() { 
    super.onEnterAnimationComplete(); 
    Toast.makeText(this, "Animation Completed", Toast.LENGTH_SHORT).show(); 
    Animation anim = AnimationUtils.loadAnimation(this, R.anim.rotate_clockwise); 
    textView.startAnimation(anim); 
} 

slide_in_up.xml

<translate 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromYDelta="100%" 
    android:toYDelta="0" 
    android:interpolator="@android:anim/linear_interpolator" 
    android:duration="3000" /> 

slide_out_down.xml

<translate 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromYDelta="0" 
    android:toYDelta="100%" 
    android:interpolator="@android:anim/linear_interpolator" 
    android:duration="3000" /> 

still.xml

0.123.
<translate 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromYDelta="0%" 
    android:toYDelta="0%" 
    android:duration="3000" /> 

rotate_clockwise.xml

<rotate 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromDegrees="0" 
    android:toDegrees="180" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:duration="3000"/> 

enter image description here

Problemi correlati