iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
Mobile Development

初窺Flutter系列 第 24

Flutter動畫-平移、旋轉和縮放動畫

  • 分享至 

  • xImage
  •  

Flutter提供了Transform小部件,用來實現平移、旋轉和縮放等變換效果。

常見效果用法

 transform: Matrix4.translationValues(_xPosition, 0, 0)  // 平移變換
      ..rotateZ(_rotation)  // 旋轉變換
      ..scale(_scale),       // 縮放變換

完整範例:按下按鈕實現平移、旋轉和縮放
常見的變換方法:
translate(_xPosition, 0, 0):_xPosition是一個變數,它用於控制平移效果,另外兩個值控制高度與深度。
rotateZ(angle):其中angle是旋轉的角度,以弧度為單位。在示例中,rotateZ(0.2)表示逆時針旋轉約11.46度。
scale(scaleFactor):其中scaleFactor是縮放因子。1.0表示原始大小,小於1.0表示縮小,大於1.0表示放大。在下列示例中,scale(2)表示將部件放大2倍。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AnimatedShapeDemo(),
    );
  }
}

class AnimatedShapeDemo extends StatefulWidget {
  @override
  _AnimatedShapeDemoState createState() => _AnimatedShapeDemoState();
}

class _AnimatedShapeDemoState extends State<AnimatedShapeDemo> {
  double _xPosition = 0.0;  // 控制平移的變數
  double _rotation = 0.0;   // 控制旋轉的變數
  double _scale = 1.0;      // 控制縮放的變數

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter 平移、旋轉和縮放動畫'),
      ),
      body: Center(
        child: AnimatedContainer(
          duration: Duration(seconds: 1),  // 動畫的持續時間
          transform: Matrix4.translationValues(_xPosition, 0, 0)  // 平移變換
            ..rotateZ(_rotation)  // 旋轉變換
            ..scale(_scale),       // 縮放變換
          width: 100,
          height: 100,
          color: Colors.blue,
          child: Center(
            child: Text(
              '動畫元素',
              style: TextStyle(color: Colors.white),
            ),
          ),
        ),
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: () {
              setState(() {
                _xPosition = 100.0;  // 點擊按鈕後,設定新的平移值
              });
            },
            child: Icon(Icons.arrow_forward), //右箭頭icon
          ),
          FloatingActionButton(
            onPressed: () {
              setState(() {
                _rotation += 0.2;  // 點擊按鈕後,增加旋轉值
              });
            },
            child: Icon(Icons.rotate_right), //旋轉icon
          ),
          FloatingActionButton(
            onPressed: () {
              setState(() {
                _scale = 2;  // 點擊按鈕後,設定新的縮放值
              });
            },
            child: Icon(Icons.zoom_in), //放大鏡icon
          ),
        ],
      ),
    );
  }
}

執行結果
原始
https://ithelp.ithome.com.tw/upload/images/20231009/20162684qkEPciLQc5.png
平移
https://ithelp.ithome.com.tw/upload/images/20231009/20162684JzdyxKuGie.png
旋轉
https://ithelp.ithome.com.tw/upload/images/20231009/20162684arCobyPk9P.png
放大
https://ithelp.ithome.com.tw/upload/images/20231009/20162684SfFGCq9b18.png


上一篇
Flutter動畫-隱藏和顯示
下一篇
Flutter-動畫-類物理特性的動畫
系列文
初窺Flutter30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言