使用 android 共享元素过渡动画时背景屏幕出现几分之一秒

Background screen appearing for a fraction of second when using android shared element transition animation

我正在尝试构建我的第一个 android 应用程序,其中我有两个活动(第一个是初始屏幕,第二个是登录屏幕)并且我在从第一个 activity到第二个。但是我做错了什么,因为过渡不顺利,并且在一瞬间,两个活动之间出现了背景屏幕。请参考 GIF 以更好地理解

我能够捕捉到活动之间出现的画面。看起来像下面,

您可以看到第一个 activity 的 ImageView 在框架中仍然可见。甚至包含“您好,欢迎回来”的 textView 也是可见的。

我在下面分享 activity 布局和相应的 java 文件,

activity_main.xml(启动画面)

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="#1f1f1d"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/splashLogo"
        android:layout_width="180dp"
        android:layout_height="80dp"
        android:background="@drawable/splash"
        android:transitionName="logo_anim"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_login.xml(登录屏幕)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#1f1f1d"

    android:orientation="vertical">

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="160dp"
        android:layout_height="90dp"
        android:layout_marginTop="30dp"
        android:layout_marginStart="20dp"
        android:transitionName="logo_anim"
        app:srcCompat="@drawable/splash" />

    <TextView
        android:id="@+id/textViewWelcome"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="25dp"
        android:fontFamily="@font/bungee"
        android:includeFontPadding="false"
        android:paddingTop="0dp"
        android:layout_marginTop="0dp"
        android:text="Hello,\nWelcome Back"
        android:textColor="#BFAD0F"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="25dp"
        android:layout_marginTop="40dp"
        android:fontFamily="@font/antic"
        android:text="Login to continue"
        android:textColor="#CCC588"
        android:textSize="18sp" />

    <LinearLayout
        // This part has the login form and buttons,
        // not adding them here as they seems to be 
        // unnecessary in this context
    </LinearLayout>
</LinearLayout>

main_activity.java(启动)

private static int SPLASH_TIMEOUT = 3000;

Animation splashAnimation;
View splashView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().setExitTransition(null);
    setContentView(R.layout.activity_main);

    splashAnimation = AnimationUtils.loadAnimation(this, R.anim.splash_animation);
    splashView = findViewById(R.id.splashLogo);
    splashView.setAnimation(splashAnimation);

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(MainActivity.this, login.class);
            ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, splashView, ViewCompat.getTransitionName(splashView));
            startActivity(intent, optionsCompat.toBundle());

            finish();
        }
    }, SPLASH_TIMEOUT);
}

login.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    getWindow().setStatusBarColor(Color.parseColor("#1f1f1d"));
    getWindow().setEnterTransition(null);
    setContentView(R.layout.activity_login);
}

@Override
public void onBackPressed() {
    finish();
}

我已经尝试了很多关于 blinking/flashing 共享元素转换的不同 Whosebug 问题中所述的解决方案,但没有任何效果。谁能指出我在这里做错了什么?

提前致谢。

这是因为当您调用 finish()

时您尝试调用的 activity 尚未准备好

在onStop方法中加入finish即可解决

@Override
public void onStop() {
   super.onStop();
   finish(); 
}

您可以在这个答案中找到更多详细信息