網站首頁 編程語言 正文
前因后果
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,這就可以了。大家可以多種組合動畫嘗試下,可以實現各種你想要的動畫。
倉促的結尾
原文鏈接:https://blog.csdn.net/haojiagou/article/details/121920534
相關推薦
- 2022-10-23 C++繼承與菱形繼承詳細介紹_C 語言
- 2023-05-06 python?字典的概念敘述和使用方法_python
- 2022-02-27 解決 idea突然使用debug功能時項目啟動一半卡住沒反應也不報錯
- 2022-09-17 Pandas查詢數據df.query的使用_python
- 2022-07-29 Pytorch實現常用乘法算子TensorRT的示例代碼_python
- 2022-09-09 Go語言提升開發效率的語法糖技巧分享_Golang
- 2022-05-15 c++11?實現枚舉值到枚舉名的轉換問題_C 語言
- 2022-06-08 Spring Cloud Ribbon 負載均衡器
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支