Flutter HeroMode Widget 動(dòng)畫轉(zhuǎn)場(chǎng)組件

image

原文

https://medium.com/flutterdevs/heromode-widget-in-flutter-9fac046fbf86

代碼

https://github.com/flutter-devs/flutter_heromode_demo

參考

正文

image

在 Flutter 中概疆,F(xiàn)lutter 應(yīng)用程序屏幕上的每個(gè)組件都是一個(gè)小工具框沟。屏幕的透視圖完全依賴于用于構(gòu)建應(yīng)用程序的小部件的選擇和分組。此外,應(yīng)用程序代碼的結(jié)構(gòu)是一個(gè)小部件樹。

在本博客中,我們將了解 HeroMode 小部件及其在 flutter 中的功能庄敛。我們將在這個(gè) HeroMode 小部件的演示程序的實(shí)現(xiàn)中看到。

“ Flutter 是谷歌的 UI 工具包蜜暑,它可以幫助你在創(chuàng)紀(jì)錄的時(shí)間內(nèi)用一個(gè)代碼庫(kù)為移動(dòng)設(shè)備铐姚、網(wǎng)絡(luò)和桌面構(gòu)建漂亮的本地組合應(yīng)用程序策肝「睾矗”

它是免費(fèi)和開源的隐绵。它最初是由谷歌發(fā)展而來(lái),目前由 ECMA 標(biāo)準(zhǔn)監(jiān)管拙毫。 Flutter 應(yīng)用程序利用達(dá)特編程語(yǔ)言來(lái)制作應(yīng)用程序依许。這個(gè) dart 編程和其他編程語(yǔ)言有一些相同的亮點(diǎn),比如 Kotlin 和 Swift惦界,并且可以被轉(zhuǎn)換成 JavaScript 代碼秕岛。

如果你想探索更多關(guān)于 Flutter 唱矛,請(qǐng)?jiān)L問 Flutter 的官方網(wǎng)站,以獲得更多的信息蛀醉。 Flutter’s official website

以下這些公司和產(chǎn)品正在使用 Flutter —— Flutter 展示

image

HeroMode 小部件

Hero 小部件是一個(gè)偉大的開箱即用的動(dòng)畫,用于通信小部件從一個(gè)頁(yè)面飛到另一個(gè)頁(yè)面的導(dǎo)航動(dòng)作衅码。英雄動(dòng)畫是兩個(gè)不同頁(yè)面之間共享的元素過渡(動(dòng)畫)≌螅現(xiàn)在來(lái)看看這個(gè),想象一個(gè)超級(jí)英雄在行動(dòng)中飛行逝段。例如垛玻,您必須有一個(gè)圖像列表。當(dāng)我們用英雄標(biāo)簽包裝它的時(shí)候∧糖現(xiàn)在我們點(diǎn)擊一個(gè)項(xiàng)目清單帚桩。而且當(dāng)被敲擊時(shí)。然后圖像列表項(xiàng)目的土地其位置在詳細(xì)頁(yè)面嘹黔。當(dāng)我們?nèi)∠⒎祷氐搅斜眄?yè)面账嚎,然后 hero 小部件返回到它的頁(yè)面。

HeroMode 小部件具有動(dòng)畫功能参淹,可以在兩個(gè)屏幕之間啟用或禁用元素醉锄。基本上浙值,當(dāng)你想禁用 Hero 小部件的動(dòng)畫功能時(shí)恳不,這個(gè)小部件是必需的。如果您想了解 Hero 模式小部件开呐,那么首先您需要了解 Hero 小部件烟勋。

是 Hero 小部件的一部分,引入這個(gè)小部件的目的是啟用和禁用 Hero 小部件的動(dòng)畫---- 如果你不想在兩個(gè)屏幕之間動(dòng)畫元素筐付,然后用 HeroMode 小部件包裝 Hero 小部件卵惦,我們可以通過使用它們的靜態(tài)屬性或動(dòng)態(tài)地啟用和禁用它們,然后通過包裝這個(gè)小部件瓦戚,當(dāng)你仔細(xì)看下面的例子視頻時(shí)發(fā)生了什么沮尿,那么你就可以看到這個(gè)動(dòng)畫中的可衡量的區(qū)別。

演示模塊:

[圖片上傳失敗...(image-6dfcc0-1631112917948)]

如何實(shí)現(xiàn) dart 文件中的代碼:

你需要分別在你的代碼中實(shí)現(xiàn)它:

首先,我為集合創(chuàng)建了一個(gè) ViewModel 類畜疾,并在開關(guān)按鈕上獲得一個(gè)布爾值赴邻。這是我在 HeroMode Widget 中通過的。

bool _isHeroModeEnable= true;
bool get isHeroModeEnable => _isHeroModeEnable;set isHeroModeEnable(bool value) {
  _isHeroModeEnable = value;
}

當(dāng)我們運(yùn)行應(yīng)用程序時(shí)啡捶,我們應(yīng)該得到屏幕的輸出姥敛,就像下面的屏幕截圖一樣。

image

然后瞎暑,我必須添加一個(gè)文本和開關(guān)按鈕來(lái)顯示 HeroMode 小部件的啟用和禁用功能彤敛。

Widget buildCategoriesSection() {
  return Container(
    padding: EdgeInsets.only(left: 20),
    child: Row(
      _//mainAxisAlignment: MainAxisAlignment.center,_ children: [
        Container(
          child: Text("Hero Mode",
            style: TextStyle(
                color: Colors._white_,
              fontSize: 18,
              fontWeight: FontWeight._bold_ ),),
        ),
        Switch(
          value: model!=null && model!.isHeroModeEnable,
          onChanged:(value){
            print("value:$value");
            model!.isHeroModeEnable=value;
          },  activeTrackColor: Color(ColorConstants._light_blue_),
         activeColor: Color(ColorConstants._pure_white_),
        ),

      ],
    ),
  );}

然后,我用電影標(biāo)題 API 創(chuàng)建了一個(gè)列表視圖了赌,但是您可以根據(jù)需要為測(cè)試目的使用一個(gè)虛擬圖像列表墨榄。在此之后,我用 Hero 小部件包裝圖像勿她,用 HeroMode 小部件包裝 Hero 小部件渠概。禁用 Hero 小部件的動(dòng)畫∩┧基本上播揪,這是一個(gè)媒介,以啟用和禁用動(dòng)畫的英雄小部件筒狠。您不能直接從 Hero Widget 禁用動(dòng)畫猪狈。

Widget _buildPopularSection() {
  return Container(
    height: 300,
    padding: EdgeInsets.only(left: 20, top: 5),
    width: MediaQuery._of_(context).size.width,
    child: model != null && model!.isPopularLoading ? Center(child: CircularProgressIndicator())
        : Provider.value(
            value: Provider._of_<HomeViewModel>(context),
            child: Consumer(
              builder: (context, value, child) => Container(
                child: ListView.builder(
                  shrinkWrap: true,
                  itemCount: model != null &&   model!.popularMovies != null ? model!.popularMovies!.results!.length : 0,
                  scrollDirection: Axis.horizontal,
                  itemBuilder: (context, index) {
                    return _buildPopularItem(
                        index, model!.popularMovies!.results![index]);
                  },
                ),
              ),
            ),
          ),
  );
}Widget _buildPopularItem(int index, Results result) {
  return GestureDetector(
    onTap: () {
      Navigator._push_(
        context,
        MaterialPageRoute(
            builder: (context) => MovieDetailView(movieDataModel: result)),
      );
    },
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Container(
          height: 200,
          width: 150,
          margin: EdgeInsets.only(right: 16),
          child: HeroMode(
            child: Hero(
                tag: '${result.id}',
              child: ClipRRect(
                borderRadius: BorderRadius.circular(25.0),
                child: Image.network(
                  Constants._IMAGE_BASE_URL_ +
                      Constants._IMAGE_SIZE_1_ +
                      '${result.posterPath}',
                  fit: BoxFit.cover,
                ),
              ),
            ),
            enabled: true,
            _//enabled:model.isHeroModeEnabled,_ ),
        ),
        SizedBox(
          height: 18,
        ),
        Container(
          child: Text(
            result.title!,
            style: TextStyle(color: Colors._white_, fontSize: 15),
          ),
        ),
        SizedBox(
          height: 5,
        ),
        Container(
          child: GFRating(
            value: _rating,
            color: Color(ColorConstants._orange_),
            size: 16,
            onChanged: (value) {
              setState(() {
                _rating = value;
              });
            },
          ),
        )
      ],
    ),
  );
}

當(dāng)我們運(yùn)行應(yīng)用程序時(shí),我們應(yīng)該得到屏幕的輸出辩恼,就像下面的屏幕截圖一樣雇庙。

image

最后,我創(chuàng)建了第二個(gè)省道文件灶伊,在這個(gè)文件中疆前,我制作了一個(gè)方法來(lái)顯示圖像動(dòng)畫。然后使用相同標(biāo)記的 Hero 小部件包裝圖像聘萨。當(dāng)您有多個(gè)圖像時(shí)竹椒,然后傳遞圖像列表 id。

Widget _buildMovieBanner(Results movieItems) {
  return Container(
    height: 380,
    child: Stack(
      children: [
        Positioned(
          top: 20,
          child: Container(
            height: 350,
            width: 240,
            margin: EdgeInsets.only(left: 28, right: 30),
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(22),
              color: Color(ColorConstants._saphire_blue2_),
            ),
          ),
        ),
        Positioned(
          top: 10,
          child: Container(
            height: 350,
            width: 250,
            margin: EdgeInsets.only(left: 22, right: 25),
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(22),
              color: Color(ColorConstants._cobaltBlue_),
            ),
          ),
        ),
        Container(
          height: 350,
          width: 260,
          margin: EdgeInsets.only(left: 16, right: 16),
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(20),
          ),
          child: ClipRRect(
            borderRadius: BorderRadius.circular(24),
            child: Hero(
              tag: '${widget.movieDataModel.id}',
              child: Image.network(
                Constants._IMAGE_BASE_URL_ +
                    Constants._IMAGE_SIZE_1_ +
                    widget.movieDataModel.posterPath!,
                fit: BoxFit.cover,
              ),
            ),
          ),
        ),
      ],
    ),
  );
}

結(jié)語(yǔ):

In this article, I have explained the basic overview of the HeroMode Widget in a flutter, you can modify this code according to your choice. This was a small introduction to HeroMode Widget On User Interaction from my side, and it’s working using Flutter.

在本文中米辐,我已經(jīng)簡(jiǎn)單介紹了 HeroMode 小部件的基本概況胸完,您可以根據(jù)自己的選擇修改這段代碼。這是一個(gè)小的介紹 HeroMode 小部件用戶交互從我這邊翘贮,它的工作使用 Flutter赊窥。

I hope this blog will provide you with sufficient information on Trying up the Explore, HeroMode Widget in your flutter projects.

我希望這個(gè)博客將提供您嘗試在您的 Flutter 項(xiàng)目的探索,HeroMode 小部件充足的信息狸页。

? ? Thanks for reading this article ??

? Thanks for reading this article ??

If I got something wrong? Let me know in the comments. I would love to improve.

如果我做錯(cuò)了什么锨能,請(qǐng)?jiān)谠u(píng)論中告訴我,我很樂意改進(jìn)。

Clap ?? If this article helps you.

鼓掌如果這篇文章對(duì)你有幫助的話址遇。

GitHub 鏈接

https://github.com/flutter-devs/flutter_heromode_demo


? 貓哥

往期

開源

GetX Quick Start

https://github.com/ducafecat/getx_quick_start

新聞客戶端

https://github.com/ducafecat/flutter_learn_news

strapi 手冊(cè)譯文

https://getstrapi.cn

微信討論群 ducafecat

系列集合

譯文

https://ducafecat.tech/categories/%E8%AF%91%E6%96%87/

開源項(xiàng)目

https://ducafecat.tech/categories/%E5%BC%80%E6%BA%90/

Dart 編程語(yǔ)言基礎(chǔ)

https://space.bilibili.com/404904528/channel/detail?cid=111585

Flutter 零基礎(chǔ)入門

https://space.bilibili.com/404904528/channel/detail?cid=123470

Flutter 實(shí)戰(zhàn)從零開始 新聞客戶端

https://space.bilibili.com/404904528/channel/detail?cid=106755

Flutter 組件開發(fā)

https://space.bilibili.com/404904528/channel/detail?cid=144262

Flutter Bloc

https://space.bilibili.com/404904528/channel/detail?cid=177519

Flutter Getx4

https://space.bilibili.com/404904528/channel/detail?cid=177514

Docker Yapi

https://space.bilibili.com/404904528/channel/detail?cid=130578

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叔收,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子傲隶,更是在濱河造成了極大的恐慌,老刑警劉巖窃页,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跺株,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脖卖,警方通過查閱死者的電腦和手機(jī)乒省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)畦木,“玉大人袖扛,你說(shuō)我怎么就攤上這事∈” “怎么了蛆封?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)勾栗。 經(jīng)常有香客問我惨篱,道長(zhǎng),這世上最難降的妖魔是什么围俘? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任砸讳,我火速辦了婚禮,結(jié)果婚禮上界牡,老公的妹妹穿的比我還像新娘簿寂。我一直安慰自己,他們只是感情好宿亡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布常遂。 她就那樣靜靜地躺著,像睡著了一般挽荠。 火紅的嫁衣襯著肌膚如雪烈钞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天坤按,我揣著相機(jī)與錄音毯欣,去河邊找鬼。 笑死臭脓,一個(gè)胖子當(dāng)著我的面吹牛酗钞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼砚作,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窘奏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起葫录,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤着裹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后米同,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骇扇,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年面粮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了少孝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熬苍,死狀恐怖稍走,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柴底,我是刑警寧澤婿脸,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站柄驻,受9級(jí)特大地震影響盖淡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凿歼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一褪迟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧答憔,春花似錦味赃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蓉驹,卻和暖如春城榛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背态兴。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工狠持, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞻润。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓喘垂,卻偏偏與公主長(zhǎng)得像甜刻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子正勒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容