使用共享元素动画切换Activity时屏幕闪烁显示系统桌面问题
嘿,我来帮你搞定这个过渡动画的问题~你遇到的这种情况,核心原因是启动页(RedirectActivity)在启动登录页后立刻调用了finish(),导致启动页的窗口被提前销毁,过渡过程中系统只保留了正在做动画的Shared Element,其他内容都没了,所以就露出了桌面和后台应用。
下面是具体的修复步骤,一步步来:
1. 延迟销毁启动页,等过渡动画完成后再执行finish()
不要在启动登录页后马上finish(),而是监听Shared Element过渡动画的结束事件,等动画跑完再销毁启动页。修改你启动登录页的代码:
else { Intent goToLogin = new Intent(RedirectActivity.this, LoginActivity.class); // 你可以把tipo也加入过渡,让两个元素一起完成动画 ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation( RedirectActivity.this, Pair.create(findViewById(R.id.meofat_logo), "logo"), Pair.create(findViewById(R.id.meofat_tipo), "tipo") ); startActivity(goToLogin, optionsCompat.toBundle()); // 监听过渡动画结束,再销毁启动页 getWindow().getSharedElementExitTransition().addListener(new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) {} @Override public void onTransitionEnd(Transition transition) { finish(); transition.removeListener(this); // 移除监听避免内存泄漏 } @Override public void onTransitionCancel(Transition transition) { finish(); transition.removeListener(this); } @Override public void onTransitionPause(Transition transition) {} @Override public void onTransitionResume(Transition transition) {} }); // 删掉原来直接调用的finish() }
2. 确保应用主题开启了窗口过渡支持
检查你的styles.xml里的App主题,是否添加了以下配置(没有的话补上):
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- 其他主题配置 --> <item name="android:windowContentTransitions">true</item> </style>
或者也可以在两个Activity的onCreate方法开头,手动开启过渡支持:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
3. 避免传统动画与Shared Element Transition冲突
你在启动页里给logo和tipo设置了Animation(upToDown和downToUp),这种传统补间动画可能会和Shared Element Transition产生冲突。可以在启动登录页前,先清除这些动画:
// 创建登录页Intent之前添加 logo.clearAnimation(); tipo.clearAnimation();
这样调整之后,过渡过程中启动页的内容会一直保留到动画完成,就不会再出现露出桌面的情况啦~
内容的提问来源于stack exchange,提问作者GaboSampaio
相关产品推荐
相关产品推荐

