Android 12 Splash Screen退出动画致BottomNavigationView下方空白
问题场景
在Android 12设备上,自定义Splash Screen退出动画结束后,页面底部的BottomNavigationView下方会出现一块额外空白区域,动画运行过程中无此问题,仅在动画结束后出现。
修复方案
问题根源在于自定义退出动画的实现未遵循SplashScreen API的正确过渡流程,导致视图布局出现异常偏移。以下是具体修复步骤:
1. 替换动画实现方式
放弃使用TranslateAnimation,改用ViewPropertyAnimator执行平移动画,这种方式能更好地与SplashScreen的视图生命周期兼容:
package prateek_gupta.physical_device_tester; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.splashscreen.SplashScreen; import androidx.core.splashscreen.SplashScreenViewProvider; import prateek_gupta.physical_device_tester.databinding.ActivityMain2Binding; public class MainActivity extends AppCompatActivity { ActivityMain2Binding binding; @Override protected void onCreate(Bundle savedInstanceState) { SplashScreen splashScreen = SplashScreen.installSplashScreen(this); splashScreen.setOnExitAnimationListener(new SplashScreen.OnExitAnimationListener() { @Override public void onSplashScreenExit(@NonNull SplashScreenViewProvider splashScreenViewProvider) { // 使用ViewPropertyAnimator实现左移动画 splashScreenViewProvider.getView() .animate() .translationX(-splashScreenViewProvider.getView().getWidth()) .setDuration(1000) .withEndAction(new Runnable() { @Override public void run() { // 动画结束后安全移除启动页视图 splashScreenViewProvider.remove(); } }); } }); super.onCreate(savedInstanceState); binding = ActivityMain2Binding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); } }
2. 额外验证项
- 检查
postSplashScreenTheme对应的主题(Theme.PhysicalDeviceTester),确保没有设置android:windowInsets、android:paddingBottom这类会影响底部布局的属性; - 确认布局文件中BottomNavigationView的约束
app:layout_constraintBottom_toBottomOf="parent"已正确配置(当前代码中该约束是正常的)。
内容的提问来源于stack exchange,提问作者Prateek Gupta
相关产品推荐
相关产品推荐

