Android?Flutter實(shí)現(xiàn)頁面切換轉(zhuǎn)場動畫效果
前言
寫了一篇基礎(chǔ)的性能優(yōu)化的內(nèi)容,繼續(xù)我們的動畫相關(guān)的介紹。今天的主角是英雄 —— Hero 組件。Hero 組件非常適合從列表、概覽頁切換到詳情頁轉(zhuǎn)場動畫場合。因?yàn)榭梢詫蓚€(gè)頁面的組件串起來動畫,體驗(yàn)上會覺得整個(gè)操作的連貫性非常好。下面是我們這篇要做的一個(gè)效果。
屏幕錄制2021-11-09 下午9.39.49.gif
Hero 動畫過程
Hero 本質(zhì)是是在不同的路由頁面做了一個(gè)中轉(zhuǎn)層,然后通過動畫完成過渡,下面用4張圖是官方演示的過程。
動畫開始前,會準(zhǔn)備一個(gè)空的遮罩層(Overlay)。此時(shí)目標(biāo)路由頁面還沒生成。
轉(zhuǎn)場前
t = 0.0,即動畫開始時(shí),源頁面已經(jīng)從屏幕消失,遮罩層出現(xiàn)在屏幕上,此時(shí)目標(biāo)路由頁面已經(jīng)構(gòu)建好,并且在遮罩層下方不可見。但此時(shí) Flutter 渲染引擎已經(jīng)計(jì)算出從遮罩層到目標(biāo)路由頁面的動畫路徑。
起始階段
動畫過程中,英雄飛起來,逐步飛到目標(biāo)頁面。使用的是Tween<Rect>
方式更改外形和位置,默認(rèn)是使用 MaterialRectArcTween
對象完成動畫。
飛行過程
動畫結(jié)束:遮罩層消失,只剩下目標(biāo)路由頁面。而源頁面恢復(fù)到它對應(yīng)的路由狀態(tài)(以便返回時(shí)使用逆向的動畫)。
動畫結(jié)束
Hero 基礎(chǔ)示例
下面來看我們本篇?jiǎng)赢嬓Ч膶?shí)現(xiàn)。對于 Hero 最簡單的應(yīng)用,就是前后兩個(gè)路由頁面的 Hero 組件使用相同的 tag
標(biāo)識,然后所有動畫都交給 Hero 來完成了 —— 果然是超級英雄,啥都不用我們管!當(dāng)然,為了用戶體驗(yàn),前后兩個(gè)頁面的組件最好是具有相同的內(nèi)容(比如圖片),然后如果組件樹結(jié)構(gòu)是一致的話效果更好。
我們這個(gè)示例的第一個(gè)頁面就是兩張小尺寸的圖片,這里的關(guān)鍵是 Hero 組件的 tag
標(biāo)簽,兩張圖片使用了不同的 tag
,這是因?yàn)橥粋€(gè)頁面的多個(gè) Hero 不能共用 tag 。
Widget?build(BuildContext?context)?{ ??return?Scaffold( ????appBar:?AppBar( ??????title:?Text('Hero?基礎(chǔ)動畫'), ??????brightness:?Brightness.dark, ????), ????body:?Center( ??????child:?Row( ????????mainAxisAlignment:?MainAxisAlignment.spaceEvenly, ????????crossAxisAlignment:?CrossAxisAlignment.center, ????????children:?[ ??????????Hero( ????????????tag:?'beauty1', ????????????child:?RoundImage( ??????????????onTap:?()?{ ????????????????Navigator.of(context).push( ??????????????????MaterialPageRoute( ????????????????????builder:?(context)?=>?HeroDetail( ??????????????????????tag:?'beauty1', ??????????????????????assetImageName:?'images/beauty.jpeg', ????????????????????), ??????????????????), ????????????????); ??????????????}, ??????????????assetImageName:?'images/beauty.jpeg', ??????????????imageSize:?80.0, ????????????), ??????????), ??????????//?省略圖片2 ????????], ??????), ????), ??); }
詳情頁面只有一個(gè)居中的圖片,也是用的 Hero 組件。只是為了和源頁面一致,這里的 tag
,圖片資源都是由源頁面?zhèn)鬟f進(jìn)來。
class?HeroDetail?extends?StatelessWidget?{ ??final?String?tag; ??final?String?assetImageName; ??const?HeroDetail({Key??key,?required?this.tag,?required?this.assetImageName}) ??????:?super(key:?key); ??@override ??Widget?build(BuildContext?context)?{ ????return?Scaffold( ??????appBar:?AppBar( ????????title:?Text('Hero?基礎(chǔ)動畫詳情'), ????????brightness:?Brightness.dark, ??????), ??????body:?Center( ????????child:?SizedBox( ??????????width:?200, ??????????height:?200, ??????????child:?Hero( ????????????tag:?this.tag, ????????????child:?RoundImage( ??????????????onTap:?()?{ ????????????????Navigator.of(context).pop(); ??????????????}, ??????????????assetImageName:?this.assetImageName, ??????????????imageSize:?200.0, ????????????), ??????????), ????????), ??????), ????); ??} }
這樣就完成了我們前面的轉(zhuǎn)場動畫效果,源碼已上傳至:動畫相關(guān)源碼。怎么樣?有了 Hero之后,是不是感覺英雄救場一樣,讓你的轉(zhuǎn)場輕松多了!
總結(jié)
本篇介紹了 Hero 動畫的基本過程和基礎(chǔ)示例。借助 Hero,對于我們很多場景可以讓轉(zhuǎn)場效果更好,比如說從商品列表切換到商品詳情,從資訊列表到資訊詳情。都可以給用戶帶來更好的體驗(yàn)。
以上就是Android Flutter實(shí)現(xiàn)頁面切換轉(zhuǎn)場動畫效果的詳細(xì)內(nèi)容,更多關(guān)于Android Flutter頁面切換轉(zhuǎn)場動畫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 自定義 View 中使用 Spannable的實(shí)例詳解
這篇文章主要介紹了Android 自定義 View 中使用 Spannable的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Android 保存Fragment 切換狀態(tài)實(shí)例代碼
本文主要介紹Android Fragment的應(yīng)用,這里給大家用實(shí)例代碼詳細(xì)介紹了Android Fragment 切換狀態(tài),有需要的小伙伴可以參考下2016-07-07Android自定義View實(shí)現(xiàn)角度選擇器
前幾天在Google Photos查看照片,用了一下它的圖片剪裁功能,于是我馬上就被其界面和操作吸引。后來想模仿做一個(gè)和Google Photos裁圖頁面幾乎一模一樣的角度選擇器,本文比較基礎(chǔ),在閱讀本文前只需要掌握最基礎(chǔ)的自定義View知識和Android事件知識。下面來一起學(xué)習(xí)下吧。2016-11-11Listview加載的性能優(yōu)化是如何實(shí)現(xiàn)的
在android開發(fā)中Listview是一個(gè)很重要的組件,它以列表的形式根據(jù)數(shù)據(jù)的長自適應(yīng)展示具體內(nèi)容,用戶可以自由的定義listview每一列的布局,接下來通過本文給大家介紹Listview加載的性能優(yōu)化是如何實(shí)現(xiàn)的,對listview性能優(yōu)化相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-01-01Android中Activity啟動默認(rèn)不顯示輸入法解決方法
這篇文章主要介紹了Android中Activity啟動默認(rèn)不顯示輸入法解決方法,一般是因?yàn)榘琧heckbox控件導(dǎo)致Activity啟動默認(rèn)不顯示輸入法,本文給出了正確解決方法,需要的朋友可以參考下2015-06-06Android中使用ZXing生成二維碼(支持添加Logo圖案)
ZXing是谷歌的一個(gè)開源庫,可以用來生成二維碼、掃描二維碼。接下來通過本文給大家介紹Android中使用ZXing生成二維碼(支持添加Logo圖案),需要的朋友參考下2017-01-01