Compose 页面切换动画

前因后果

Compose 正式版已经发布了一个多月了,从 Compose beta 版本发布之后各大网站中热度就一直不减,官方也一直在为开发者们推出学习 Compose 的文章,更加说明了 Android 开发的未来趋势。

在之前我写了 Compose 版本的玩安卓,当然也有 MVVM 版本的,只是不同分支而已,这是 Github地址:https://github.com/zhujiang521/PlayAndroid

但之前一直存在着一个问题,就是页面切换的时候没有动画,也不能说没有动画,可以通过 Crossfade 来实现两个页面之间的淡入淡出,但这就够了吗?完全不够啊!咱们的产品和UI第一个不答应,只是淡入淡出是绝对不行的!

开始尝试

其实 Compose 中的 Navigation 就是之前 Jetpack 中的 Navigation 改的,所以之前的 api 还是存在的,

然后用上试试呗!

navController.navigate(route) {anim {enter = R.anim.in_from_rightexit = R.anim.out_to_leftpopEnter = R.anim.in_from_rightpopExit = R.anim.out_to_left}
}

然后就有了上面的代码进行尝试,其实写的时候也想过不行,因为在 Compose 中动画有自己的一套实现方式,并不是像之前那样放在 anim 文件夹下的 xml 文件,但还是抱着试一试的态度,最后发现。。。果然不行。。。

于是开始一顿乱找,后来发现在官方文档中已经写明了:

注意anim 块不能与 Navigation Compose 一起使用。系统会在此功能请求中跟踪 Navigation Compose 中的转换动画。

然后就没有然后了,就开始等。。。。这一等就是好久。(其实这篇文章是之前写的,但一直没发)

终于在前段时间,这个问题有了眉目,Google 并没有将这个功能放到 Navigation 库中,而是重新创建了一个库:navigation-animation,使用的时候同时引入即可进行使用。

开始撸码

首先需要做的肯定是添加依赖:

现在应用级的 build.gradle 中添加:

repositories {mavenCentral()
}

然后在 Module 级的 build.gradle 中添加:

// Navigation 动画
implementation "com.google.accompanist:accompanist-navigation-animation:$accompanist_version"

接下来需要做的是迁移之前写的 Navigation 的代码,先来看看之前的写法吧:

@ExperimentalPagingApi
@Composable
fun NavGraph(startDestination: String = MainDestinations.HOME_PAGE_ROUTE
) {val navController = rememberNavController()val actions = remember(navController) { MainActions(navController) }NavHost(navController = navController,startDestination = startDestination) {composable(MainDestinations.HOME_PAGE_ROUTE) {Home(actions)}}
}

需要做的迁移有:

  • 替换rememberNavController()rememberAnimatedNavController()
  • 替换NavHostAnimatedNavHost
  • 替换import androidx.navigation.compose.navigationimport com.google.accompanist.navigation.animation.navigation
  • 替换import androidx.navigation.compose.composableimport com.google.accompanist.navigation.animation.composable

那就来吧:

@OptIn(ExperimentalAnimationApi::class, ExperimentalPagerApi::class)
@Composable
fun NavGraph(startDestination: String = PlayDestinations.HOME_PAGE_ROUTE,
) {val navController = rememberAnimatedNavController()val actions = remember(navController) { PlayActions(navController) }AnimatedNavHost(navController = navController,startDestination = startDestination) {setComposable(PlayDestinations.HOME_PAGE_ROUTE) {WeatherViewPager(toCityList = actions.toCityList,toWeatherList = actions.toWeatherList)}}
}

下面就来看看如何使用这个库为页面之间切换添加动画吧:

@ExperimentalAnimationApi
public fun NavGraphBuilder.navigation(startDestination: String,route: String,enterTransition: (AnimatedContentScope<NavBackStackEntry>.() -> EnterTransition?)? = null,exitTransition: (AnimatedContentScope<NavBackStackEntry>.() -> ExitTransition?)? = null,popEnterTransition: (AnimatedContentScope<NavBackStackEntry>.() -> EnterTransition?)? = enterTransition,popExitTransition: (AnimatedContentScope<NavBackStackEntry>.() -> ExitTransition?)? = exitTransition,builder: NavGraphBuilder.() -> Unit
)

上面这段代码是 navigation-animation 库中的源码,可以看到除了之前 Navigation 库中的一些参数外还多了几个参数用来设置动画,来具体看看吧:

  • **enterTransition:**在此 NavGraph 中定义目的地的输入转换动画
  • **exitTransition:**在此 NavGraph 中为目的地定义退出转换动画
  • **popEnterTransition:**在此 NavGraph 中定义目的地的弹出输入转换动画
  • **popExitTransition:**在此 NavGraph 中为目的地定义弹出退出转换动画

再来看看具体使用吧:

composable(route = route,arguments = arguments,deepLinks = deepLinks,enterTransition = {expandVertically(animationSpec = tween(300))},exitTransition = {shrinkOut(animationSpec = tween(300))},popEnterTransition = {expandVertically(animationSpec = tween(300))},popExitTransition = {shrinkOut(animationSpec = tween(300))},content = content,
)

OK,这就可以了。大家可以多种组合动画尝试下,可以实现各种你想要的动画。

仓促的结尾

本篇文章到这里就差不多了,但如果大家没有使用过 Compose 或者对之前使用的 Navigation 并不熟悉的话可以先去看看我之前的文章,大家可以购买我的新书《Jetpack Compose:Android全新UI编程》进行阅读,里面有完整的 Compose 框架供大家学习。

京东购买地址

当当购买地址

呸呸呸,太不要脸了,又在推荐自己的新书。。。

如果对你有帮助的话,别忘记点个 Star,感激不尽。

Compose 页面切换动画相关推荐

  1. android学习笔记---56_activity切换动画与页面切换动画,自定义activity窗口切换动画效果的实现.

    2013/5/17 Java技术qq交流群:JavaDream:251572072 56_activity切换动画与页面切换动画 ----------------------------------- ...

  2. 开博第一篇作品-C#winform版《仿360杀毒》页面切换动画效果(内含源码)

    C#winform版 <仿360杀毒>页面切换动画效果 昨天跟一个同事聊天,谈到了360杀毒的页面效果不错,我们所做的winform页面都是拖控件还是拖控件,不能吸引客户的注意力,想改成3 ...

  3. vue页面切换动画-类似于轮播效果、渲染列表给每一行数据加上显示动画

    vue页面切换动画-类似于轮播效果 <transition :name="transitionName"><router-view/> </trans ...

  4. 第12章动画-Hero页面切换动画

    防采集标记:亢少军老师的课程和资料 import 'package:flutter/material.dart';void main() {runApp(new MaterialApp(title: ...

  5. android 设置全局的页面切换动画问题

    这两天在看android 设置页面切换动画,看的很纠结,晕菜了 我这里有四个手机, 一加 版本  5.1.1   小米2s  版本 5.0 华为P6   版本    4.4.2   酷派版本   4. ...

  6. 赞!超炫的页面切换动画效果【附源码下载】

    在下面的示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果.虽然有些效果都非常简单,只是简单的滑动动作,但另外的一些则是利用了视角(Perspective)和 3D 转换(3D ...

  7. html怎么做动态切换效果,使用CSS制作一个比较炫酷的页面切换动画

    今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果.虽然有些效果都非常简单,只是简单的滑动动作,但另外的一些则是利用了 ...

  8. Windows Phone 实用开发技巧(9):自定义Windows Phone 页面切换动画

    在Silverlight for Windows Phone ToolKit 中默认中有自带的页面Transitions:RollTransition.RotateTransition.SlideTr ...

  9. Android ViewPager2自定义页面切换动画

    默认切换动画 MainActivity override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstance ...

最新文章

  1. Go 学习笔记(37)— 标准命令(go build 跨平台编译、交叉编译、go clean、go run、go fmt、go install、go get)
  2. 用Cordova打包Vue-vux项目
  3. Numpy入门教程:07. 随机抽样
  4. 【翻译转载】【官方教程】Asp.Net MVC4入门指南(2):添加一个控制器
  5. 解决虚拟机VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法
  6. 有关sql server 2000的数据类型
  7. day57:00:26:34
  8. 连接wifi的主机设置静态ip(固定ip)后无法上网的原因
  9. NLTK的图形化语料文本下载器downloader
  10. Chrome 69正式版浏览器遭批 恢复完整显示域名
  11. Docker 验证 Centos7.2 离线安装 Docker 环境
  12. IDEA/Pycharm 插件与主题切换
  13. 关注程序员健康之——研究显示白天小睡90分钟将有效增强记忆力
  14. Excel函数与公式
  15. LU分解解线性方程组python实现
  16. 【代码质量】嵌入式编程节约内存技巧
  17. 【DuerOS开发日记】2.打造属于自己的小度(1):使用PythonSDK
  18. zcash mining
  19. BAT美女哪家强?阿里云深藏第一女神!
  20. 淘宝、1688获得店铺的所有商品信息API调用展示

热门文章

  1. Jqgird 如何使用自带的search模块进行数据查询
  2. 如何解决4G摄像头在智能巡检中掉线的方案
  3. fh admin mysql版本_在用mysql-front的时候遇到显示:程序注册时间到期程序将被限制模式下运行。...
  4. 图片怎么转成PDF格式?介绍三种转换思路
  5. 拼多多item_get_app - 根据ID取商品详情原数据
  6. 读NP-C及哥德尔不完备定理感想
  7. 齐岳定制|Cyclopropene-PEG-Xylan|环丙烯-聚乙二醇-木聚糖
  8. 第十一单元 面向对象-多态
  9. 一键打开多个软件 开发工具
  10. java无法重命名文件_巧妙地解决Java文件重命名失败的问题