Android之Compose页面切换动画介绍

 更新时间:2021年12月15日 11:02:11   作者:朱 江  
大家好,本篇文章主要讲的是Android之Compose页面切换动画介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

Accompanist

前因后果

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_right
        exit = R.anim.out_to_left
        popEnter = R.anim.in_from_right
        popExit = 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,这就可以了。大家可以多种组合动画尝试下,可以实现各种你想要的动画。

仓促的结尾

到此这篇关于Android之Compose页面切换动画介绍的文章就介绍到这了,更多相关Android Compose页面切换动画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android studio 连接手机调试操作步骤

    Android studio 连接手机调试操作步骤

    这篇文章主要介绍了Android studio 连接手机调试操作步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Android判断json格式将错误信息提交给服务器

    Android判断json格式将错误信息提交给服务器

    今天小编就为大家分享一篇关于Android判断json格式将错误信息提交给服务器,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • SwipeLayout框架实现侧拉删除编辑功能

    SwipeLayout框架实现侧拉删除编辑功能

    这篇文章主要为大家详细介绍了SwipeLayout框架实现侧拉删除编辑功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android利用AsyncTask异步类实现网页内容放大缩小

    Android利用AsyncTask异步类实现网页内容放大缩小

    这篇文章主要为大家介绍了利用AsyncTask异步类实现网页内容放大缩小的相关资料,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android AndFix热修复原理详情

    Android AndFix热修复原理详情

    这篇文章主要介绍了Android AndFix热修复原理详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值吗,需要的小伙伴可以参考一下
    2022-08-08
  • Android编程之代码创建布局实例分析

    Android编程之代码创建布局实例分析

    这篇文章主要介绍了Android编程之代码创建布局的方法,结合实例形式分析了Android通过代码创建布局的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android自定义照相机详解

    Android自定义照相机详解

    几乎每个APP都会用的相机功能,下面小编把内容整理分享到脚本之家平台,供大家参考
    2016-04-04
  • Android存储访问框架的使用小结

    Android存储访问框架的使用小结

    这篇文章主要介绍了Android存储访问框架的使用,存储访问框架API和MediaStore API的差异,在于存储访问框架API,是基于系统文件选择框的,用户选择了文件,那么相当于授权了, 可以访问所有类型的文件,需要的朋友可以参考下
    2022-01-01
  • 基于AnDroid FrameLayout的使用详解

    基于AnDroid FrameLayout的使用详解

    本篇文章是对AnDroid FrameLayout的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Anroid四大组件service之本地服务的示例代码

    Anroid四大组件service之本地服务的示例代码

    本篇文章主要介绍了Anroid四大组件service之本地服务的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论