亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android?Flutter如何實現3D動畫效果

發布時間:2022-03-24 09:15:21 來源:億速云 閱讀:206 作者:iii 欄目:開發技術

這篇文章主要講解了“Android Flutter如何實現3D動畫效果”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Android Flutter如何實現3D動畫效果”吧!

AnimatedWidget 簡介

AnimatedWidget是一個抽象的 StatefulWidget, 構造方法如下所示。

const AnimatedWidget({
    Key? key,
    required this.listenable,
  }) : assert(listenable != null),
       super(key: key);

主要在于接收一個 listenable 參數,通常會是 Animation 對象。在 AnimatedWidget 內部的_AnimatedState 類中,會添加該對象變化監聽回調,進而刷新界面。

class _AnimatedState extends State<AnimatedWidget> {
  @override
  void initState() {
    super.initState();
    widget.listenable.addListener(_handleChange);
  }

  @override
  void didUpdateWidget(AnimatedWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (widget.listenable != oldWidget.listenable) {
      oldWidget.listenable.removeListener(_handleChange);
      widget.listenable.addListener(_handleChange);
    }
  }

  @override
  void dispose() {
    widget.listenable.removeListener(_handleChange);
    super.dispose();
  }

  void _handleChange() {
    setState(() {
      // The listenable's state is our build state, and it changed already.
    });
  }
  
  // ...
}

可以看到,只需要將 Animation 對象傳給 AnimatedWidget 對象后,就不需要我們之前那樣自己寫 addListener 之類的處理了。而整個動畫可以交給外部其他對象來控制,從而實現動畫組件的復用。

3D 旋轉動畫的實現

3D 旋轉的實現比較簡單,在 Container 組件有兩個參數控制轉換(transform),分別是:

  • transformMatrix4對象,可以實現圍繞 X、Y、Z軸的旋轉、平移,以及變形等效果。關于 Matrix4涉及到很多矩陣運算和線性代數的知識,可以參考 Matrix4的源碼自行溫習一下大學的數學知識。

  • transformAlignment:轉換的對齊方式,可以理解為起點位置,可以使用 Alignment 對象來設置。

有了這個基礎,我們就可以定義3D 旋轉動效了,我們定義一個通用的組件,ThreeDAnimatedWidget

class ThreeDAnimatedWidget extends AnimatedWidget {
  final Widget child;
  const ThreeDAnimatedWidget(
      {Key? key, required Animation<double> animation, required this.child})
      : super(key: key, listenable: animation);

  @override
  Widget build(BuildContext context) {
    final animation = listenable as Animation<double>;

    return Center(
      child: Container(
        transform: Matrix4.identity()
          ..rotateY(2 * pi * animation.value)
          ..setEntry(1, 0, 0.01),
        transformAlignment: Alignment.center,
        child: child,
      ),
    );
  }
}

這里我們設置的是圍繞中心點繞 Y 軸旋轉,并使用 setEntry 設置了一定的傾斜角 (這會更有立體感)。實際我們也可以設置圍繞 X 軸或 Z 軸旋轉。接下來就是這個動畫組件的應用了,我們構建一個帶有陰影的文字(看起來像立體字)作為這個動畫的子組件,其他的控制和上一篇的是類似的,完整代碼如下:

class AnimatedWidgetDemo extends StatefulWidget {
  const AnimatedWidgetDemo({Key? key}) : super(key: key);

  @override
  _AnimatedWidgetDemoState createState() => _AnimatedWidgetDemoState();
}

class _AnimatedWidgetDemoState extends State<AnimatedWidgetDemo>
    with SingleTickerProviderStateMixin {
  late Animation<double> animation;
  late AnimationController controller;

  @override
  void initState() {
    super.initState();
    controller =
        AnimationController(duration: const Duration(seconds: 3), vsync: this);
    animation = Tween<double>(begin: 0.0, end: 1.0).animate(controller);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AnimatedWidget 動畫'),
      ),
      body: ThreeDAnimatedWidget(
        animation: animation,
        child: Text(
          '島上碼農',
          style: TextStyle(
            fontSize: 42.0,
            color: Colors.blue,
            fontWeight: FontWeight.bold,
            shadows: [
              Shadow(
                  blurRadius: 2,
                  offset: Offset(2.0, 1.0),
                  color: Colors.blue[900]!),
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.play_arrow, color: Colors.white),
        onPressed: () {
          if (controller.status == AnimationStatus.completed) {
            controller.reverse();
          } else {
            controller.forward();
          }
        },
      ),
    );
  }

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

可以看到,這個 ThreeDAnimatedWidget 可以做到復用了,在需要這樣動效的場景里,按照上面的方式給它傳入 Animation 對象和子組件就可以了。例如我們將文字修改為一張圖片。

//...
body: ThreeDAnimatedWidget(
  animation: animation,
  child: Image.asset(
    'images/avatar.jpg',
    width: 100,
    height: 100,
  ),
),
//...

Android?Flutter如何實現3D動畫效果

感謝各位的閱讀,以上就是“Android Flutter如何實現3D動畫效果”的內容了,經過本文的學習后,相信大家對Android Flutter如何實現3D動畫效果這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄平县| 洪湖市| 湟中县| 阳信县| 香河县| 六盘水市| 彩票| 安西县| 余庆县| 周至县| 平武县| 绥宁县| 涞水县| 洪雅县| 鄂托克前旗| 凉城县| 平武县| 河曲县| 彭州市| 五寨县| 祁阳县| 新竹县| 苏州市| 扎囊县| 扎鲁特旗| 郯城县| 丁青县| 海兴县| 霍邱县| 陇川县| 错那县| 靖边县| 永寿县| 千阳县| 镇雄县| 葵青区| 平武县| 许昌市| 太原市| 玉龙| 松滋市|