使用 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();
}
您可以在这个答案中找到更多详细信息
我正在尝试构建我的第一个 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();
}
您可以在这个答案中找到更多详细信息