使用Android共享元素过渡动画时,背景屏幕会出现一秒钟的时间

问题描述

我正在尝试构建我的第一个android应用程序,其中有两个活动(第一个活动是启动屏幕,第二个活动是登录屏幕),并且在从第一个活动移动到第二个活动时,我正在使用共享元素过渡。但是我做错了事,因为过渡不顺利,而且一瞬间,两个活动之间出现了背景屏幕。请参阅GIF以更好地了解

GIF

我能够捕获活动之间出现的框架。看起来像这样,

enter image description here

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

我在下面共享活动布局和相应的Java文件,

activity_main.xml(启动画面)

textView

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

main_activity.java(启动)

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

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

我尝试了许多关于闪烁共享元素过渡的不同stackoverflow问题中所述的解决方案,但没有任何效果。谁能指出我在这里做错了什么?

谢谢。

解决方法

发生这种情况是因为当您调用 finish() 时,您尝试调用的活动尚未准备好

可以通过在onStop方法中添加finish来解决

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

您可以找到有关此答案的更多详细信息 https://stackoverflow.com/a/29663116

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...