日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

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

作者:朱?江 ? 更新時(shí)間: 2022-02-11 編程語(yǔ)言

Accompanist

前因后果

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

替換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)畫(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

欄目分類
最近更新