溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android Compose頁(yè)面切換動(dòng)畫怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-15 13:33:36 來(lái)源:億速云 閱讀:541 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“Android Compose頁(yè)面切換動(dòng)畫怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在Android Compose頁(yè)面切換動(dòng)畫怎么實(shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Android Compose頁(yè)面切換動(dòng)畫怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

開(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()

替換NavHostAnimatedNavHost

替換import androidx.navigation.compose.navigationimport com.google.accompanist.navigation.animation.navigation

替換import androidx.navigation.compose.composableimport 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,
)

到此,關(guān)于“Android Compose頁(yè)面切換動(dòng)畫怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI