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頁面切換動畫內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: