Jetpack Compose 将动画实现的门槛降低了——从 "如果有时间再慢慢打磨" 到 "动画实现很简单,没有理由不试试看了"。这里有个很大的课题是页面级的过渡动画,这也是 Navigation Compose 一直致力解决的问题,具体是满足下面三种场景:
仅使用 Compose 1.0.0 中稳定的动画 API
开始对 Compose 1.0.0 中存在的实验性动画 API 提供支持
构建在 Compose 1.1.0 及更高版本中面向未来的动画 API (共享元素过渡)
Navigation Compose
https://developer.android.google.cn/jetpack/compose/navigation
每一种情况的实现方法都稍有不同,我们将在本文中介绍。
Compose ???? 动画
从首次发布 Jetpack Compose 0.1.0-dev01 到最新的 Compose 1.0.1,经历了漫长的过程。相对于 View 系统而言,它巨大的改进之一便是动画和过渡。在追求完美的动画 API 的过程中,对 Compose 进行了大量的修改才一步步迭代到版本 1.0.0。
虽然许多底层的动画 API,比如非常强大的 animateTo() 和 animate*AsState() 到目前为止是 Compose 稳定的基础构成部分,但仍有许多基于这些代码构建的 API 被标记为 @ExperimentalAnimationApi。
实验性 API 和语义化版本控制
实验性 API (任何在 Kotlin 领域使用 @RequiresOptIn 注解的 API) 可能随时会被更改。这意味着这些 API 可能在未来任一版本 (可能是 Compose 1.1.0-alpha04 或者 1.2.0-alpha08) 中被更改、优化或替换。因此,如果您使用了任何一个基于这些实验性 API 构建的库,当您更新了您使用的 Compose 版本但没有同时更新这些库的版本时,这些库可能会直接崩溃并构建失败。(如果您使用了早期发布的 Compose 版本,您就会知道这种痛苦。)
所有 AndroidX 库 (包括 Navigation 和 Compose),都遵循严格的语义化版本控制,如 AndroidX 版本页面所述。这意味着一旦某个库迭代至候选版本 (Release Candidate,即 RC),任何非实验性 API 将不会再被更改。对这些稳定的 API 进行破坏性变更需要增加主版本号 (如,'2.0')。
严格的语义化版本控制
https://semver.org/AndroidX 版本页面
https://developer.android.google.cn/jetpack/androidx/versions
这对向前和向后兼容很友好。例如,您可以升级 Fragment 版本以尝试新的 alpha 内容,同时将其他依赖项保持在其稳定版本上,一切工作如常。
然而,这也意味着严格禁止实验性 API (即可以从您底层移除的 API) 跨越不同的库使用。例如,升级您的 androidx.fragment 版本不应该破坏 androidx.appcompat。这一规则同样应用于 androidx.navigation 和 androidx.compose.animation。
使 Navigation 2.4 稳定
Navigation 2.4 是一个重要的版本,它既是第一个 Navigation Compose 版本,也是第一个对 Navigation Compose 和带有 Fragment 的 Navigation 支持