Android 在活动事务之后未调用OneNetanimationComplete()

Android 在活动事务之后未调用OneNetanimationComplete(),android,android-activity,android-transitions,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&g

我有两个活动和一个共享对象,一个
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>
在活动B中,我想在相同的共享ImageView上启动一个简单的摆动动画。如果我使用
onCreate
方法启动动画,结果会非常糟糕,因为它在活动转换结束之前启动。因此,我覆盖活动B中的
oneteranimationcomplete()
方法:

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

问题是,什么也没发生。活动和共享元素转换将播放,但当它们结束时,另一个动画将不会启动。通过检查logcat输出,我发现该方法甚至没有被调用。有什么想法吗?

有一个解决办法。您可以推迟“活动输入”转换,将预绘制侦听器添加到图像中(或由您决定),设置动画,然后启动延迟的输入转换

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

我不知道OneNetanimationComplete()不被调用是否是故意的行为,但如果是,那么这是框架团队的一大疏忽。

我已经测试了代码,它工作得很好

将按钮添加到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);
        }
    });
}
覆盖ActivityB的动画以正确理解

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);
}
将\u滑入\u 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" />

滑出\u 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

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

顺时针旋转_.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"/>


这似乎是一个相关的SO问题。
<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"/>