Flutter交互式画布插件interactive_canvas的使用

Flutter交互式画布插件interactive_canvas的使用

interactive_canvas 插件可以将任何子部件变成一个可交互的画布。它支持缩放、旋转和平移功能,并且可以通过控制器来控制这些功能。你可以通过控制器获取和设置缩放比例、偏移量和旋转角度。此外,该插件还提供了在开始、更新和结束缩放事件时的回调。

预览:

预览

画布功能:

  • 缩放
  • 旋转
  • 平移(拖动)

安装:

请参考 Pub.dev 的安装指南。

语法:

ICanvas 类

ICanvas(
    {this.child,                    // 子部件可以是任何你希望作为画布的部件
    this.controller,                // 使用 ICanvasController 来控制 ICanvas
    this.height,                    // 高度
    this.width,                     // 宽度
    this.background,                // 设置画布背景颜色
    this.maxScale = 2.0,            // 最大缩放比例
    this.minScale = 0.5,            // 最小缩放比例
    this.enableTranslation = false, // 允许画布平移
    this.enableRotation = false,    // 允许画布旋转
    this.clipRotation = true});     // 限制旋转到 90 度

ICanvasController 类

ICanvasController({initialScale = 1.0})  // 设置初始缩放比例

API 方法

  • 获取缩放比例

    double get scale
    scale = _controller.scale
    
  • 设置缩放比例

    set setScale(double value)
    _controller.setScale = 1.5
    
  • 获取偏移量

    Offset get offset
    offset = _controller.offset
    
  • 设置偏移量

    set setOffset(Offset value)
    _controller.setOffset = Offset(0,10)
    
  • 获取旋转角度

    double get rotation
    rotation = _controller.rotation
    
  • 设置旋转角度

    set setRotation(double value)
    _controller.setRotation = pi/4
    

    注意: 旋转角度以弧度为单位

  • 开始缩放事件

    onZoomStart()
    _controller.onZoomStart( (){ print( _controller.scale ); } )
    
  • 更新缩放事件

    onZoomUpdate()
    _controller.onZoomUpdate( (){ print( _controller.scale ); } )
    
  • 结束缩放事件

    onZoomEnd()
    _controller.onZoomEnd( (){ print( _controller.scale ); } )
    

示例

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ICanvasController _iCanvasController = ICanvasController(initialScale: 1.0);
  String _zoomDetails = "Zoom";

  [@override](/user/override)
  Widget build(BuildContext context) {
    _iCanvasController.onZoomUpdate(() {
      setState(() {
        _zoomDetails = "Scale = " + _iCanvasController.scale.toStringAsFixed(2);
        _zoomDetails += "\nRotation = " + _iCanvasController.rotation.toStringAsFixed(2);
        _zoomDetails += "\nOffset = (" + _iCanvasController.offset.dx.toStringAsFixed(2) + "," + _iCanvasController.offset.dy.toStringAsFixed(2) + ")";
      });
    });

    return Scaffold(
      appBar: AppBar(title: Text("Zommer Example")),
      body: Center(
        child: Stack(
          children: [
            Align(
              alignment: Alignment.topCenter,
              child: SizedBox(
                height: 150,
                child: Text(
                  _zoomDetails,
                  textAlign: TextAlign.center,
                  style: TextStyle(fontSize: 30),
                ),
              ),
            ),
            Center(
              child: ICanvas(
                enableTranslation: true,
                enableRotation: true,
                clipRotation: true,
                maxScale: 2,
                minScale: 0.5,
                background: BoxDecoration(color: Colors.white),
                height: 300,
                width: 300,
                controller: _iCanvasController,
                child: Container(
                  decoration: BoxDecoration(color: Colors.green),
                  height: 200,
                  width: 200,
                  child: FlutterLogo(),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter交互式画布插件interactive_canvas的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter交互式画布插件interactive_canvas的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用interactive_canvas插件来创建一个交互式画布的示例代码。interactive_canvas插件允许用户在画布上进行绘制、缩放、平移等操作。需要注意的是,实际开发中可能需要根据具体需求进行调整和扩展。

首先,确保你已经在pubspec.yaml文件中添加了interactive_canvas依赖:

dependencies:
  flutter:
    sdk: flutter
  interactive_canvas: ^最新版本号  # 请替换为实际最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个简单的示例代码,展示如何使用interactive_canvas

import 'package:flutter/material.dart';
import 'package:interactive_canvas/interactive_canvas.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Interactive Canvas Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: InteractiveCanvasDemo(),
    );
  }
}

class InteractiveCanvasDemo extends StatefulWidget {
  @override
  _InteractiveCanvasDemoState createState() => _InteractiveCanvasDemoState();
}

class _InteractiveCanvasDemoState extends State<InteractiveCanvasDemo> {
  final InteractiveCanvasController _controller = InteractiveCanvasController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Interactive Canvas Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: InteractiveCanvas(
          controller: _controller,
          backgroundColor: Colors.white,
          onGesture: (details) {
            // 处理手势事件,比如绘制、缩放、平移等
            setState(() {}); // 更新状态以重绘画布
          },
          child: CustomPaint(
            painter: MyPainter(_controller.paths),
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 添加一个新的路径用于绘制
          _controller.addPath();
        },
        tooltip: 'Add Path',
        child: Icon(Icons.add),
      ),
    );
  }
}

class MyPainter extends CustomPainter {
  final List<List<Offset>> paths;
  final Paint paint = Paint()
    ..color = Colors.black
    ..strokeWidth = 4.0
    ..style = PaintingStyle.stroke;

  MyPainter(this.paths);

  @override
  void paint(Canvas canvas, Size size) {
    for (var path in paths) {
      Path drawingPath = Path();
      for (int i = 0; i < path.length; i++) {
        if (i == 0) {
          drawingPath.moveTo(path[i].dx, path[i].dy);
        } else {
          drawingPath.lineTo(path[i].dx, path[i].dy);
        }
      }
      canvas.drawPath(drawingPath, paint);
    }
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return oldDelegate != this;
  }
}

在这个示例中,我们创建了一个InteractiveCanvasDemo页面,其中包含一个InteractiveCanvas组件。InteractiveCanvasController用于管理画布的状态和操作。我们定义了一个自定义绘制器MyPainter,它根据_controller.paths中的路径来绘制内容。

注意:

  1. InteractiveCanvasController提供了添加路径、管理路径、处理手势等方法,但具体的手势处理逻辑(如绘制、缩放、平移)需要开发者根据需求自行实现。
  2. MyPainter类用于根据路径列表绘制内容。在这个简单的示例中,它只绘制了直线,实际应用中可能需要更复杂的绘制逻辑。
  3. 由于interactive_canvas插件的具体API和实现可能会有所不同,建议查阅最新的官方文档以获取详细信息和最佳实践。

这个示例代码只是一个起点,你可以根据具体需求进一步扩展和完善。

回到顶部