You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用共享元素动画切换Activity时屏幕闪烁显示系统桌面问题

解决Android Shared Element Transition时仅显示Logo动画、其他内容消失的问题

嘿,我来帮你搞定这个过渡动画的问题~你遇到的这种情况,核心原因是启动页(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:20:06