gpt4 book ai didi

Android 共享元素从启动画面到主 Activity 的过渡

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:38 27 4
gpt4 key购买 nike

我的应用程序在显示主要 Activity 之前显示启动画面 1 秒钟。初始屏幕和主要 Activity 共享一个公共(public)图像,需要从初始屏幕的中心到主要 Activity 布局的顶部进行动画处理。

因为如果将启动画面实现为 <layer-list>,则如何完成此动画并不明显。在主要 Activity 中的背景图像(参见 Splash Screens the Right WayHow do I make a splash screen? ),我决定将启动画面实现为正常 Activity ,并使用共享元素过渡来为两个 Activity 之间的图像设置动画。最初,我使用以下 onCreate()启动 Activity 中的实现:

public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);

ImageView imageView = (ImageView)findViewById(R.id.imageView);
String transitionName = ViewCompat.getTransitionName(imageView);
Intent intent = new Intent(this, LoginActivity.class);
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(
this, imageView, transitionName);

imageView.postDelayed(() -> {
ActivityCompat.startActivity(SplashActivity.this, intent, options.toBundle());
finish();
}, 1000);
}
}

这种方法有两个问题:

  1. 调用 finish()调用startActivity()后立即导致启动 Activity 窗口在动画开始之前被隐藏/销毁,这导致主屏幕在动画期间暂时闪烁到 View 中。
  2. 从主 Activity 按下后退键会自动触发共享元素返回转换,导致图像在主 Activity 窗口关闭后悬浮在主屏幕上 500 毫秒。返回转换失败,因为启动 Activity 已经调用了 finish(),因此不再位于返回堆栈中。

为了解决第一个问题,我包装了finish()调用 postDelay() Runnable 以确保仅在共享元素转换完成后才调用它。 1500 毫秒的延迟适用于我的应用程序,但应根据其他用例所需的时间调整该值。

...

imageView.postDelayed(() -> {
ActivityCompat.startActivity(SplashActivity.this, intent, options.toBundle());
imageView.postDelayed(this::finish, 1500);
}, 1000);

为了解决第二个问题,我覆盖了主要 Activity 的 onBackPressed()直接调用finish()的方法从而避免默认实现调用 finishAfterTransitions() .这可以防止 Activity 尝试执行共享元素返回转换。

@Override
public void onBackPressed() {
finish();
}

任何改进此解决方案的替代方法或建议将不胜感激。

最佳答案

为什么不使用共享相同 Activity 的 fragment 呢?我看不出有什么理由为这么简单的事情使用 2 种不同的 Activity 。

关于Android 共享元素从启动画面到主 Activity 的过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com