2015-10-31 17 views
5

私は単一の共有オブジェクトを持つ2つのアクティビティ、ImageViewを持っています。どちらの活動はAppCompatActivityのサブクラスであり、彼らは同じテーマを共有:アクティビティトランザクションの後にonEnterAnimationComplete()が呼び出されない

<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は次のように活動Bを呼び出します:アクティビティBで

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

、私は上の簡単なウォブリングアニメーションを開始したいです同じ共有ImageView。 onCreateメソッドでアニメーションを開始すると、結果はより前に開始され、のアクティビティ遷移が終了するため、結果はかなり醜いものになります。だから私は、アクティビティBにonEnterAnimationComplete()メソッドを上書きする:問題がある

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

を、何も起こりません。アクティビティと共有要素のトランジションは再生されますが、終了すると他のアニメーションは開始しません。 logcatの出力を確認すると、メソッドが呼び出されていないことがわかります。何かご意見は?

答えて

0

解決策があります。アクティビティの入力トランジションを延期したり、イメージにプレドローリスナを追加したり(それはあなた次第です)、アニメーションを設定して、延期された入力トランジションを開始することができます。私にはわからない

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場合は()の挙動を目的としていると呼ばれるが、それは、その後であれば、これはフレームワークチームから大きな見落としであるばかりではありません。

+0

これは、関連するSOの質問のようです。 http://stackoverflow.com/questions/39488410/onenteranimationcomplete-not-called-api-21 – Kiki

0

私はコードをテストしており、それは完全に動作しています。

MainActivityにボタンを追加して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); 
     } 
    }); 
} 

適切

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

を理解するためにオーバーライドActivityBのアニメーション
<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