網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前因后果
Compose
正式版已經(jīng)發(fā)布了一個(gè)多月了,從 Compose beta
版本發(fā)布之后各大網(wǎng)站中熱度就一直不減,官方也一直在為開(kāi)發(fā)者們推出學(xué)習(xí) Compose
的文章,更加說(shuō)明了 Android
開(kāi)發(fā)的未來(lái)趨勢(shì)。
在之前我寫(xiě)了 Compose
版本的玩安卓,當(dāng)然也有 MVVM 版本的,只是不同分支而已,這是 Github地址:https://github.com/zhujiang521/PlayAndroid
但之前一直存在著一個(gè)問(wèn)題,就是頁(yè)面切換的時(shí)候沒(méi)有動(dòng)畫(huà),也不能說(shuō)沒(méi)有動(dòng)畫(huà),可以通過(guò) Crossfade
來(lái)實(shí)現(xiàn)兩個(gè)頁(yè)面之間的淡入淡出,但這就夠了嗎?完全不夠??!咱們的產(chǎn)品和UI第一個(gè)不答應(yīng),只是淡入淡出是絕對(duì)不行的!
開(kāi)始嘗試
其實(shí) 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 } }
然后就有了上面的代碼進(jìn)行嘗試,其實(shí)寫(xiě)的時(shí)候也想過(guò)不行,因?yàn)樵?Compose
中動(dòng)畫(huà)有自己的一套實(shí)現(xiàn)方式,并不是像之前那樣放在 anim 文件夾下的 xml 文件,但還是抱著試一試的態(tài)度,最后發(fā)現(xiàn)。。。果然不行。。。
于是開(kāi)始一頓亂找,后來(lái)發(fā)現(xiàn)在官方文檔中已經(jīng)寫(xiě)明了:
注意:
anim
塊不能與 Navigation Compose 一起使用。系統(tǒng)會(huì)在此功能請(qǐng)求中跟蹤 Navigation Compose 中的轉(zhuǎn)換動(dòng)畫(huà)。
然后就沒(méi)有然后了,就開(kāi)始等。。。。這一等就是好久。(其實(shí)這篇文章是之前寫(xiě)的,但一直沒(méi)發(fā))
終于在前段時(shí)間,這個(gè)問(wèn)題有了眉目,Google 并沒(méi)有將這個(gè)功能放到 Navigation
庫(kù)中,而是重新創(chuàng)建了一個(gè)庫(kù):navigation-animation
,使用的時(shí)候同時(shí)引入即可進(jìn)行使用。
開(kāi)始擼碼
首先需要做的肯定是添加依賴:
現(xiàn)在應(yīng)用級(jí)的 build.gradle 中添加:
repositories { mavenCentral() }
然后在 Module 級(jí)的 build.gradle 中添加:
// Navigation 動(dòng)畫(huà) implementation "com.google.accompanist:accompanist-navigation-animation:$accompanist_version"
接下來(lái)需要做的是遷移之前寫(xiě)的 Navigation
的代碼,先來(lái)看看之前的寫(xiě)法吧:
@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
那就來(lái)吧:
@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 ) } } }
下面就來(lái)看看如何使用這個(gè)庫(kù)為頁(yè)面之間切換添加動(dòng)畫(huà)吧:
@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
庫(kù)中的源碼,可以看到除了之前 Navigation
庫(kù)中的一些參數(shù)外還多了幾個(gè)參數(shù)用來(lái)設(shè)置動(dòng)畫(huà),來(lái)具體看看吧:
**enterTransition:**在此 NavGraph 中定義目的地的輸入轉(zhuǎn)換動(dòng)畫(huà)
**exitTransition:**在此 NavGraph 中為目的地定義退出轉(zhuǎn)換動(dòng)畫(huà)
**popEnterTransition:**在此 NavGraph 中定義目的地的彈出輸入轉(zhuǎn)換動(dòng)畫(huà)
**popExitTransition:**在此 NavGraph 中為目的地定義彈出退出轉(zhuǎn)換動(dòng)畫(huà)
再來(lái)看看具體使用吧:
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,這就可以了。大家可以多種組合動(dòng)畫(huà)嘗試下,可以實(shí)現(xiàn)各種你想要的動(dòng)畫(huà)。
倉(cāng)促的結(jié)尾
原文鏈接:https://blog.csdn.net/haojiagou/article/details/121920534
相關(guān)推薦
- 2023-01-13 pytorch如何定義新的自動(dòng)求導(dǎo)函數(shù)_python
- 2022-10-07 C#如何實(shí)現(xiàn)調(diào)取釘釘考勤接口的功能_C#教程
- 2022-09-25 python?opencv實(shí)現(xiàn)圖像矯正功能_python
- 2021-12-15 vscode?ssh安裝librosa處理音頻的解決方法_其它綜合
- 2022-10-18 Qt基于TCP實(shí)現(xiàn)客戶端與服務(wù)端的連接_C 語(yǔ)言
- 2022-08-02 Go語(yǔ)言resty?http包調(diào)用jenkins?api實(shí)例_Golang
- 2022-12-01 RFO?SIG之openEuler?AWS?AMI?制作詳解_云其它
- 2021-12-03 Android識(shí)別NFC芯片制造商的方法_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支