Flutter - 彈跳按鈕動畫

您作為用戶的經(jīng)歷多次點擊沒有動畫的按鈕谎僻,因為您不知道它是否確實發(fā)送了您請求的操作?如果按鈕有一個輕微的動畫告訴你它實際被點擊了艘绍,你就不需要做了多次同樣的事情。

什么是動畫挎挖?我們?yōu)槭裁匆褂盟鼈儯?/h4>

在為您的應(yīng)用程序創(chuàng)建良好的用戶體驗時,添加制作精良且流暢的動畫至關(guān)重要航夺。它們作為用戶行為的視覺反饋蕉朵,也可以提供互動和保證的意義阳掐。

動畫按鈕就是本文的內(nèi)容堪伍,特別是我們將構(gòu)建一個小型彈跳動畫,當用戶單擊按鈕時會觸發(fā)該動畫觅闽。

首先帝雇,按鈕布局

按鈕布局基于一個簡單的容器,其中心有一個文本小部件蛉拙。

Widget get _animatedButtonUI => Container(
            height: 100,
            width: 250,
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(100),
              boxShadow: [ shadow ],
              gradient: LinearGradient(
                begin: Alignment.topLeft,
                end: Alignment.bottomRight,
                colors: [
                  Color(0xFFA7BFE8),
                  Color(0xFF6190E8),
                ],
              ),
            ),
            child: Center(
              child: Text(
                'tap!',
                style: TextStyle(
                  fontSize: 30,
                  fontWeight: FontWeight.bold,
                  color: Colors.white,
                ),
              ),
            ),
          );

我們來看看動畫

我們需要使用setState()和dispose()函數(shù)孕锄,因此我們將擴展StatefulWidget吮廉。

class AnimatedButton extends StatefulWidget {
      @override
      _AnimatedButtonState createState() => _AnimatedButtonState();
    }

    class _AnimatedButtonState extends State<AnimatedButton> {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
      
      Widget get _animatedButtonUI => ...
      
}

我們都準備開始制作動畫了宦芦。

讓我們實現(xiàn)SingleTickerProviderStateMixin并定義我們創(chuàng)建動畫所需的兩個屬性轴脐。

class _AnimatedButtonState extends State<AnimatedButton> with SingleTickerProviderStateMixin {
        
    double _scale;
    AnimationController _controller;
    
        @override
        Widget build(BuildContext context) {
          return Container();
        }
        ...
}

現(xiàn)在是時候通過重寫initState()來初始化我的_controller并通過覆蓋dispose()函數(shù)來處理它


    @override
    void initState() {
      super.initState();
      _controller = AnimationController(
        vsync: this,
        duration: Duration(milliseconds: 200),
        lowerBound: 0.0,
        upperBound: 0.1,
      )
      ..addListener(() { setState(() {});});
    }
    
    @override
    void dispose() {
      _controller.dispose();
      super.dispose();
    }

接下來,我們定義了兩個函數(shù)大咱,一個用于按下按鈕,另一個用于釋放按鈕時溯捆,前者將告訴我們的控制器繼續(xù)前進厦瓢,而后者則反過來


    void _onTapDown(TapDownDetails details) {
      _controller.forward();
    }

    void _onTapUp(TapUpDetails details) {
      _controller.reverse();
    }

最后,在我們的構(gòu)建函數(shù)中煮仇,我們設(shè)置了scale變量,讓GestureDetector處理tapDown和tapUp屬性售碳,然后使用Transform小部件進行縮放

    @override
    Widget build(BuildContext context) {
      _scale = 1 - _controller.value;

      return GestureDetector(
        onTapDown: _onTapDown,
        onTapUp: _onTapUp,
        child: Transform.scale(
          scale: _scale,
          child: _animatedButtonUI,
        ),
      );
    }

這是最終的結(jié)果

結(jié)論

這是一篇關(guān)于如何創(chuàng)建簡單而有效的動畫的快速文章绞呈,我希望這將有助于您改進應(yīng)用程序用戶體驗间景。

全部代碼

import 'package:flutter/material.dart';

class AnimatedButton extends StatefulWidget {
  @override
  _AnimatedButtonState createState() => _AnimatedButtonState();
}

class _AnimatedButtonState extends State<AnimatedButton>
    with SingleTickerProviderStateMixin {
  double _scale;
  AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: Duration(milliseconds: 200),
      lowerBound: 0.0,
      upperBound: 0.1,
    )..addListener(() {
        setState(() {});
      });
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _onTapDown(TapDownDetails details) {
    _controller.forward();
  }

  void _onTapUp(TapUpDetails details) {
    _controller.reverse();
  }

  @override
  Widget build(BuildContext context) {
    _scale = 1 - _controller.value;

    return GestureDetector(
      onTapDown: _onTapDown,
      onTapUp: _onTapUp,
      child: Transform.scale(
        scale: _scale,
        child: _animatedButtonUI,
      ),
    );
  }

  Widget get _animatedButtonUI => Container(
        height: 100,
        width: 250,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(100),
          boxShadow: [
            BoxShadow(
              color: Color(0x80000000),
              blurRadius: 30.0,
              offset: Offset(0.0, 30.0),
            ),
          ],
          gradient: LinearGradient(
            begin: Alignment.topLeft,
            end: Alignment.bottomRight,
            colors: [
              Color(0xFFA7BFE8),
              Color(0xFF6190E8),
            ],
          ),
        ),
        child: Center(
          child: Text(
            'tap!',
            style: TextStyle(
              fontSize: 30,
              fontWeight: FontWeight.bold,
              color: Colors.white,
            ),
          ),
        ),
      );
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末圾亏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子志鹃,更是在濱河造成了極大的恐慌,老刑警劉巖曹铃,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陕见,死亡現(xiàn)場離奇詭異,居然都是意外死亡评甜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門粘舟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佩研,“玉大人,你說我怎么就攤上這事韧骗。” “怎么了些侍?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵政模,是天一觀的道長。 經(jīng)常有香客問我淋样,道長,這世上最難降的妖魔是什么刊咳? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任儡司,我火速辦了婚禮,結(jié)果婚禮上捕犬,老公的妹妹穿的比我還像新娘酵镜。我一直安慰自己柴钻,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布靠粪。 她就那樣靜靜地躺著粱腻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绍些。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天啸澡,我揣著相機與錄音氮帐,去河邊找鬼。 笑死上沐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的龄广。 我是一名探鬼主播蕴侧,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敲才!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起紧武,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刁岸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迫横,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酝碳,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年呛讲,在試婚紗的時候發(fā)現(xiàn)自己被綠了返奉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡雷逆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膀哲,到底是詐尸還是另有隱情被碗,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布兴喂,位于F島的核電站,受9級特大地震影響衣迷,放射性物質(zhì)發(fā)生泄漏娩嚼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一岳悟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呵俏,春花似錦滔灶、人聲如沸普碎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽动猬。三九已至,卻和暖如春赁咙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崔拥。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工凤覆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叛赚。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓俺附,卻偏偏與公主長得像肥卡,于是被迫代替她去往敵國和親事镣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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