前因后果
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()
替换NavHost
为AnimatedNavHost
替换import androidx.navigation.compose.navigation
为import com.google.accompanist.navigation.animation.navigation
替换import androidx.navigation.compose.composable
为import 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页面切换动画内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!