Android之Compose頁(yè)面切換動(dòng)畫介紹

前因后果
Compose 正式版已經(jīng)發(fā)布了一個(gè)多月了,從 Compose beta 版本發(fā)布之后各大網(wǎng)站中熱度就一直不減,官方也一直在為開(kāi)發(fā)者們推出學(xué)習(xí) Compose 的文章,更加說(shuō)明了 Android 開(kāi)發(fā)的未來(lái)趨勢(shì)。
在之前我寫了 Compose 版本的玩安卓,當(dāng)然也有 MVVM 版本的,只是不同分支而已,這是 Github地址:https://github.com/zhujiang521/PlayAndroid
但之前一直存在著一個(gè)問(wèn)題,就是頁(yè)面切換的時(shí)候沒(méi)有動(dòng)畫,也不能說(shuō)沒(méi)有動(dòng)畫,可以通過(guò) Crossfade 來(lái)實(shí)現(xiàn)兩個(gè)頁(yè)面之間的淡入淡出,但這就夠了嗎?完全不夠?。≡蹅兊漠a(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í)寫的時(shí)候也想過(guò)不行,因?yàn)樵?Compose 中動(dòng)畫有自己的一套實(shí)現(xiàn)方式,并不是像之前那樣放在 anim 文件夾下的 xml 文件,但還是抱著試一試的態(tài)度,最后發(fā)現(xiàn)。。。果然不行。。。
于是開(kāi)始一頓亂找,后來(lái)發(fā)現(xiàn)在官方文檔中已經(jīng)寫明了:
注意:
anim塊不能與 Navigation Compose 一起使用。系統(tǒng)會(huì)在此功能請(qǐng)求中跟蹤 Navigation Compose 中的轉(zhuǎn)換動(dòng)畫。
然后就沒(méi)有然后了,就開(kāi)始等。。。。這一等就是好久。(其實(shí)這篇文章是之前寫的,但一直沒(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)畫 implementation "com.google.accompanist:accompanist-navigation-animation:$accompanist_version"
接下來(lái)需要做的是遷移之前寫的 Navigation 的代碼,先來(lái)看看之前的寫法吧:
@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)畫吧:
@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)畫,來(lái)具體看看吧:
**enterTransition:**在此 NavGraph 中定義目的地的輸入轉(zhuǎn)換動(dòng)畫
**exitTransition:**在此 NavGraph 中為目的地定義退出轉(zhuǎn)換動(dòng)畫
**popEnterTransition:**在此 NavGraph 中定義目的地的彈出輸入轉(zhuǎn)換動(dòng)畫
**popExitTransition:**在此 NavGraph 中為目的地定義彈出退出轉(zhuǎn)換動(dòng)畫
再來(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)畫嘗試下,可以實(shí)現(xiàn)各種你想要的動(dòng)畫。
倉(cāng)促的結(jié)尾
到此這篇關(guān)于Android之Compose頁(yè)面切換動(dòng)畫介紹的文章就介紹到這了,更多相關(guān)Android Compose頁(yè)面切換動(dòng)畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android Compose 屬性動(dòng)畫使用探索詳解
- Compose開(kāi)發(fā)之動(dòng)畫藝術(shù)探索及實(shí)現(xiàn)示例
- Android中分析Jetpack?Compose動(dòng)畫內(nèi)部的實(shí)現(xiàn)原理
- Jetpack Compose實(shí)現(xiàn)列表和動(dòng)畫效果詳解
- Jetpack Compose實(shí)現(xiàn)動(dòng)畫效果的方法詳解
- 通過(guò)Jetpack Compose實(shí)現(xiàn)雙擊點(diǎn)贊動(dòng)畫效果
- 利用Jetpack Compose繪制可愛(ài)的天氣動(dòng)畫
- Compose?動(dòng)畫藝術(shù)之屬性動(dòng)畫探索
相關(guān)文章
Android 中okhttp自定義Interceptor(緩存攔截器)
這篇文章主要介紹了Android 中okhttp自定義Interceptor(緩存攔截器)的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android UI設(shè)計(jì)系列之自定義DrawView組件實(shí)現(xiàn)數(shù)字簽名效果(5)
這篇文章主要介紹了Android UI設(shè)計(jì)系列之自定義DrawView組件實(shí)現(xiàn)數(shù)字簽名效果,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
完美解決Android App啟動(dòng)頁(yè)有白屏閃過(guò)的問(wèn)題
這篇文章主要介紹了完美解決Android App啟動(dòng)頁(yè)有白屏閃過(guò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Android7.0 MTK設(shè)置默認(rèn)桌面
這篇文章主要為大家詳細(xì)介紹了Android7.0 MTK設(shè)置默認(rèn)桌面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Android Studio使用教程(六):Gradle多渠道打包
這篇文章主要介紹了Android Studio使用教程(六):Gradle多渠道打包,本文講解了友盟多渠道打包、assemble結(jié)合Build Variants來(lái)創(chuàng)建task、完整的gradle腳本等內(nèi)容,需要的朋友可以參考下2015-05-05
Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果
這篇文章主要介紹了Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android開(kāi)發(fā)中LayoutInflater用法詳解
這篇文章主要介紹了Android開(kāi)發(fā)中LayoutInflater用法,結(jié)合實(shí)例形式分析了LayoutInflater類的功能、作用、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-08-08
Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果
這篇文章主要介紹了Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果,邏輯非常簡(jiǎn)單,或許繪圖方面更加繁瑣XD 需要的朋友可以參考下2016-04-04

