在活动事务之后不调用onEnterAnimationComplete()

Nek*_*u89 5 android android-activity android-transitions

我有两个活动,只有一个共享对象,一个ImageView.这两个活动都是子类,AppCompatActivity它们共享相同的主题:

<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>
Run Code Online (Sandbox Code Playgroud)

活动A按以下方式调用活动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());
Run Code Online (Sandbox Code Playgroud)

在Activity B上,我想在同一个共享的ImageView上启动一个简单的摆动动画.如果我在onCreate方法上启动动画,结果非常难看,因为它在活动转换结束之前开始.所以我覆盖了onEnterAnimationComplete()Activity B中的方法:

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

问题是,没有任何反应.活动和共享元素转换播放,但当它们结束时,其他动画将无法启动.检查logcat输出我发现甚至没有调用该方法.有什么想法吗?

pap*_*ouk 0

有一个解决方法。您可以推迟 Activity 输入转换,向图像添加 preDraw 侦听器(或其他任何内容,由您决定),设置动画,然后启动推迟的输入转换。

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;
            }
        });
Run Code Online (Sandbox Code Playgroud)

我不知道 onEnterAnimationComplete() 没有被调用是否是预期的行为,但如果是的话,那么这是框架团队的一个重大疏忽。