五、Flutter動畫

目錄

  • 1. Flutter 中動畫的基本概念是什么?
  • 2. 解釋 AnimationController 和 Tween 的作用
  • 3. 如何實現一個補間(Tween)動畫?
  • 4. 什么是隱式動畫?舉例說明
  • 5. 如何實現自定義復雜動畫?

1. Flutter 中動畫的基本概念是什么?

在 Flutter 中,動畫是通過在一段時間內連續改變屬性值來實現的視覺效果變化。核心概念包括:

概念說明
動畫值隨時間變化的數值(通常是 0.0 → 1.0)
動畫控制器管理動畫的播放、停止、反轉等操作
補間 (Tween)定義起始值和結束值之間的過渡(如位置、大小、顏色等)
動畫曲線控制動畫變化速率(如加速、減速、彈跳等)
動畫監聽器在動畫值變化時更新 UI
動畫狀態運行中 (forward)、完成 (completed)、反轉中 (reverse)、停止 (dismissed)

動畫分類

  • 隱式動畫:自動處理的簡單動畫(如 AnimatedContainer
  • 顯式動畫:需要手動控制的復雜動畫(使用 AnimationController

2. 解釋 AnimationController 和 Tween 的作用

AnimationController

  • 作用:管理動畫的播放狀態和持續時間
  • 特點
    • 需要 TickerProvide*(如 SingleTickerProviderStateMixin
    • 默認輸出 0.0 → 1.0 的值
    • 控制動畫播放 (forward())、停止 (stop())、反轉 (reverse())
  • 創建
late AnimationController _controller;
void initState() {super.initState();_controller = AnimationController(duration: const Duration(seconds: 2),  // 動畫時長vsync: this,  // 使用 TickerProvider);
}

Tween

  • 作用:定義動畫的值范圍(如顏色、大小、位置等)
  • 特點
    • 將 0.0→1.0 映射到實際值范圍
    • 支持多種數據類型(ColorTwee*, SizeTween 等)
  • 使用
final Animation<double> _sizeAnim = Tween<double>(begin: 50.0, end: 200.0,
).animate(_controller);

3. 如何實現一個補間(Tween)動畫?

步驟

  1. 創建 AnimationController
  2. 定義 Tween 并綁定控制器
  3. 添加監聽器重建 UI
  4. 啟動動畫

示例代碼

class TweenAnimationDemo extends StatefulWidget {_TweenAnimationDemoState createState() => _TweenAnimationDemoState();
}class _TweenAnimationDemoState extends State<TweenAnimationDemo> with SingleTickerProviderStateMixin {late AnimationController _controller;late Animation<double> _sizeAnim;late Animation<Color?> _colorAnim;void initState() {super.initState();// 1. 創建控制器_controller = AnimationController(duration: const Duration(seconds: 2),vsync: this,)..repeat(reverse: true); // 循環播放// 2. 創建補間動畫_sizeAnim = Tween<double>(begin: 50, end: 200).animate(_controller);_colorAnim = ColorTween(begin: Colors.blue, end: Colors.red).animate(_controller);}Widget build(BuildContext context) {// 3. 使用 AnimatedBuilder 優化性能return AnimatedBuilder(animation: _controller,builder: (context, child) {return Center(child: Container(width: _sizeAnim.value,height: _sizeAnim.value,color: _colorAnim.value,),);},);}void dispose() {_controller.dispose(); // 釋放資源super.dispose();}
}

4. 什么是隱式動畫?舉例說明

隱式動畫:只需設置目標值,Flutter 自動處理動畫過程的簡化動畫。

特點

  • 無需管理 AnimationController
  • 內置 300ms 默認動畫時長
  • 通過 setState() 改變屬性值自動觸發

常用隱式動畫組件

組件作用
AnimatedContainer容器屬性變化(大小/顏色等)
AnimatedOpacity透明度變化
AnimatedPositioned位置變化(Stack 內)
AnimatedAlign對齊方式變化

示例:點擊改變容器大小和顏色

class ImplicitAnimationDemo extends StatefulWidget {_ImplicitAnimationDemoState createState() => _ImplicitAnimationDemoState();
}class _ImplicitAnimationDemoState extends State<ImplicitAnimationDemo> {double _size = 100;Color _color = Colors.blue;void _animate() {setState(() {_size = _size == 100 ? 200 : 100;_color = _color == Colors.blue ? Colors.green : Colors.blue;});}Widget build(BuildContext context) {return GestureDetector(onTap: _animate,child: AnimatedContainer(duration: Duration(seconds: 1), // 動畫時長width: _size,height: _size,color: _color,curve: Curves.easeInOut, // 動畫曲線child: Center(child: Text('點擊我')),),);}
}

5. 如何實現自定義復雜動畫?

對于復雜動畫(如路徑動畫、物理動畫、多動畫同步),推薦使用:

1. 組合多個動畫

late Animation<double> _sizeAnim;
late Animation<double> _rotationAnim;
void initState() {super.initState();_sizeAnim = Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(parent: _controller,curve: Interval(0.0, 0.5), // 只在前半段執行),);_rotationAnim = Tween(begin: 0.0, end: 2 * pi).animate(CurvedAnimation(parent: _controller,curve: Interval(0.5, 1.0), // 只在后半段執行),);
}

2. 使用物理動畫(SpringSimulation)

void _runSpringAnimation() {final spring = SpringSimulation(SpringDescription(mass: 1, stiffness: 100, damping: 10),0.0,   // 起始位置300.0, // 目標位置10.0,  // 初始速度);_controller.animateWith(spring);
}

3. 自定義動畫曲線

final customCurve = CurveTween(curve: Curves.easeInOutBack,
);_animation = customCurve.animate(_controller);

4. 使用動畫狀態機

_controller.addStatusListener((status) {if (status == AnimationStatus.completed) {_controller.reverse();} else if (status == AnimationStatus.dismissed) {_controller.forward();}
});

完整示例:彈跳球效果

class BouncingBallDemo extends StatefulWidget {_BouncingBallDemoState createState() => _BouncingBallDemoState();
}class _BouncingBallDemoState extends State<BouncingBallDemo>with SingleTickerProviderStateMixin {late AnimationController _controller;late Animation<double> _bounceAnim;void initState() {super.initState();_controller = AnimationController(duration: const Duration(seconds: 2),vsync: this,)..repeat(reverse: true);// 使用彈性曲線模擬彈跳_bounceAnim = Tween<double>(begin: 0, end: 300).animate(CurvedAnimation(parent: _controller,curve: Curves.elasticOut, // 彈性效果),);}Widget build(BuildContext context) {return AnimatedBuilder(animation: _controller,builder: (context, child) {return Stack(children: [Positioned(bottom: _bounceAnim.value,left: MediaQuery.of(context).size.width / 2 - 25,child: Container(width: 50,height: 50,decoration: BoxDecoration(color: Colors.red,shape: BoxShape.circle,),),),],);},);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913104.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全網唯一/Qt結合ffmpeg實現手機端采集攝像頭推流到rtsp或rtmp/可切換前置后置攝像頭/指定分辨率幀率

一、前言說明 之前已經實現了Qt結合ffmpeg在安卓上運行&#xff0c;所有在win上的功能&#xff0c;在安卓上都已經實現&#xff0c;比如編碼保存到MP4文件&#xff0c;正常解碼音視頻文件播放等&#xff0c;唯獨還差一個功能&#xff0c;盡管用的不多&#xff0c;但是還是有一…

Install Ubuntu 24.04 System

1.制作安裝鏡像盤&#xff08;U盤&#xff09; 下載rufus制作工具(網址&#xff1a;https://www.xiaomoxz.com/nexus/bi1/rufus4.shtml?bd_vid8643969197265870719&#xff09; 2. 設置U盤啟動&#xff1a; F2進入BIOS 3. Install Ubuntu 24.04 Ubuntu下載地址&#xff1a;…

solidjs 處理復雜類型的響應式

solidjs 處理復雜類型的響應式 在 solidjs 里響應式一般直接用 createSignal 就可以&#xff0c;但 createSignal 一般用于基礎數據類型。 雖然復雜類型也是可以使用&#xff0c;但基于起細粒度響應性的特性。 一般復雜的數據使用 createSignal 就不是那么友好了。 所以 cre…

爬蟲技術-獲取瀏覽器身份認證信息(如 Cookie、Token、Session 等)

方法一&#xff1a;通過瀏覽器開發者工具查看和提取 Cookie / Token &#x1f4cc; 示例場景&#xff1a; 你在使用一個網站時已經登錄了&#xff0c;想看看這個網站是如何保存你的身份憑證的。 &#x1f527; 操作過程&#xff1a; 打開瀏覽器&#xff08;例如 Chrome&#xf…

[密碼學實戰]GMT 0136-2024《密碼應用HTTP接口規范》解析

[密碼學實戰]GM/T 0136-2024《密碼應用HTTP接口規范》解析國家密碼管理局于2025年7月1日正式實施GM/T 0136-2024標準&#xff0c;該規范首次統一了密碼服務的HTTP接口設計&#xff0c;為國產密碼技術的規模化應用鋪平道路。本文結合標準原文&#xff0c;深入剖析其技術細節并給…

Docker 國內鏡像列表(免費長期)

Docker 可用鏡像源列表&#xff08;7月1日更新-長期維護&#xff09;_dockerhub國內鏡像源列表-CSDN博客

BlenderFBXExporter 導出fbx被修改問題

1&#xff09; 解決增加A節點的問題 https://github.com/A-Ribeiro/CustomBlenderFBXExporter 2&#xff09;找出blendshape 不一致&#xff0c;生成blendshape key name映射map 文件compare.txt C:\Users\49938\Documents\DazToUnreal\zhang01\UpdatedFBX\zhang01_fix7.fbx…

AI時代下的IT服務管理轉型:趨勢、挑戰與破局之道

近年來&#xff0c;人工智能&#xff08;AI&#xff09;與自動化技術的迅猛發展&#xff0c;正以前所未有的速度重塑企業運營的各個層面。特別是在IT服務管理&#xff08;ITSM&#xff09;領域&#xff0c;AI的介入不僅提高了問題響應效率&#xff0c;也推動了組織從“被動響應…

三體融合實戰:Django+訊飛星火+Colossal-AI的企業級AI系統架構

目錄 技術棧關鍵詞&#xff1a;Django 5.0 訊飛星火4.0Ultra Colossal-AI 1.2 WebSocket 聯邦學習 ? 核心架構設計 &#x1f6e0;? 一、Django深度集成訊飛星火API&#xff08;免費版&#xff09; 1. 獲取API憑證 2. 流式通信改造&#xff08;解決高并發阻塞&#xff09…

多模態數據融合預警:從IoT傳感器到衛星監測的可視化方案升級

你有沒有想過&#xff0c;為什么有些城市在暴雨來臨時能提前數小時發布內澇預警&#xff0c;而有些地方卻只能“等水來了才反應”&#xff1f; 背后的關鍵&#xff0c;就是多模態數據融合預警系統——它把來自IoT傳感器、無人機、地面雷達、氣象站、甚至衛星的數據整合在一起&a…

面試八股---css

2、css 2.1 說說你對盒子模型的理解 是什么 當對一個文檔進行布局&#xff08;layout&#xff09;的時候&#xff0c;瀏覽器的渲染引擎會根據標準之一的 CSS 基礎框盒模型&#xff08;CSS basic box model&#xff09;&#xff0c;將所有元素表示為一個個矩形的盒子&#xf…

day52-硬件學習之RTC及ADC

一、RTCRTC&#xff08;實時時鐘&#xff09;&#xff1a;非易失性在IMX6ULL內部SNVS&#xff08;安全的非易失性存儲器&#xff09;提供RTC功能&#xff1b;原理圖&#xff1a;二、ADC 2.1 基本概念ADC(模擬數字轉換器)&#xff1a;用于將連續變化的模擬信號轉換為離散的數字信…

Web 項目如何自動化測試?

Web 項目的自動化測試可以通過 UI自動化 和 接口自動化 結合實現&#xff0c;提高測試效率和覆蓋率。以下是關鍵方法和工具&#xff1a; 【自動化測試】從基礎到實戰基于Pytest自動化/python自動化的詳細教程&#xff01;1. UI自動化測試&#xff08;前端交互&#xff09; 適用…

Java連接阿里云MaxCompute例

要使用Java連接阿里云MaxCompute&#xff08;原名ODPS&#xff09;數據庫&#xff0c;您可以遵循以下步驟進行配置和編程&#xff1a; 1. 添加依賴 確保您的項目中包含了MaxCompute JDBC驅動的依賴。如果您使用Maven&#xff0c;可以在pom.xml中添加如下依賴&#xff1a; &l…

【網絡與系統安全】強制訪問控制——BLP模型

一、模型背景與定義 BLP&#xff08;Bell-LaPadula&#xff09;模型是由David Bell和Len Adula在1973年提出的強制訪問控制&#xff08;MAC&#xff09;模型&#xff0c;是最早的計算機安全模型之一&#xff0c;主要用于解決多用戶系統中的信息機密性保護問題&#xff0c;尤其…

HTTPS詳解:原理 + 加解密過程 + 面試問答

一、HTTP 與 HTTPS 的區別 項目HTTPHTTPS全稱HyperText Transfer ProtocolHyperText Transfer Protocol Secure端口80443協議層應用層應用層 TLS&#xff08;安全層&#xff09;加密方式明文傳輸加密傳輸&#xff08;TLS&#xff09;安全性易被劫持、中間人攻擊可加密、防篡改…

Python-GUI-wxPython-控件

1 需求 2 接口 3.* 控件&#xff1a;wx.StaticText import wxclass MainFrame(wx.Frame):def __init__(self, *args, **kwargs):super(MainFrame, self).__init__(*args, **kwargs)self.init_ui()self.Center()self.Maximize()def init_ui(self):static_text wx.StaticText(pa…

3-1 PID算法改進(積分部分)

目錄 1、積分限幅 2、積分分離 3、變速積分 在位置式PID的基礎上進行改進 定速用PI控制&#xff0c;定位置用PD控制 1、積分限幅 在定速控制上體現 第一種方法確定上下限方法&#xff1a;Out最大時&#xff0c;除以Ki&#xff0c;得到一個值&#xff0c;上限不能超過這個…

Linux探秘坊-------13.進程間通信

1.進程間通信?的 2.管道 2.1 匿名管道 -----通常用來實現 父子通信 創建子進程時&#xff0c;需要把父進程的進程內容全部拷貝一份&#xff0c;但文件管理是不需要拷貝的 但是我們把父進程的文件描述符表給拷貝下來了&#xff0c;文件描述符表里是一堆指針&#xff0c;他們仍…

深入理解Vapnik-Chervonenkis(VC)維度:機器學習泛化能力的理論基礎

引言 通過本篇閱讀,從理論上去理解為什么: 要選擇復雜度低的模型 過擬合的時候,增加樣本量有用 以及如何根據樣本量選擇特征個數 PAC機器學習框架, VC 維是機器學習最重要的基礎理論之一 在機器學習領域&#xff0c;模型泛化能力是衡量算法性能的核心指標…