2015-10-31 15 views
5

Tek bir paylaşılan nesne olan ImageView numaralı iki Etkinliğim var. Her iki faaliyetler AppCompatActivity alt sınıfları olan ve aynı Tema paylaşan:onEnterAnimationComplete(), bir Hareket Sonrası İşlemden sonra çağrılmıyor

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

A Etkinliği şu şekilde Etkinlik B çağırır:

Aktivite B On
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()); 

, ben basit bir yalpalandırma animasyonu başlatmak istiyor aynı paylaşılan ImageView. Animasyonu onCreate yöntemiyle başlatırsam, sonuç çok çirkin olur; çünkü'dan önce başlar. Bu yüzden Etkinlik B'de onEnterAnimationComplete() yöntemini yaz: sorundur

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

hiçbir şey olmaz. Etkinlik ve paylaşımlı öğe geçişleri oynar, ancak bittiğinde diğer animasyon başlamaz. Logcat çıktısının kontrol edilmesi Yöntemin bile çağrılmadığını görüyorum. Düşüncesi olan var mı?

cevap

0

Bunun için bir çözüm var. Sen, geçiş girmek Aktivite erteleme görüntünüzün (ya da her neyse, bu size kalmış), kurulum animasyonlarınıza bir preDraw dinleyici ekleyin, sonra da enter ertelendi geçişi başlatabilirsiniz. Bilmiyorum

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; 
      } 
     }); 

onEnterAnimationComplete if() davranışı amaçlanmıştır adlandırılan, ancak daha sonra ise bu çerçeve ekibinden büyük bir gözetim olduğunu almıyorum.

+0

bu alakalı bir SO soru gibi görünüyor. http://stackoverflow.com/questions/39488410/onenteranimationcomplete-not-called-api-21 – Kiki

0

Kodu test ettim ve mükemmel çalışıyor.

ActivityB'ye gitmek için MainActivity öğesine bir düğme ekleyin. ActivityB ait

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); 
     } 
    }); 
} 

geçersiz kıl Animasyon düzgün

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

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