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

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

交互式画布(Interactional Canvas)

pub package

interactional_canvas 是一个 Flutter 包,它提供了交互式画布功能,可以在 InteractiveViewer 中添加节点并操作这些节点。

使用方法(Usage)

要使用这个包,在你的 pubspec.yaml 文件中添加 interactional_canvas 作为依赖项。

dependencies:
  interactional_canvas: ^x.y.z

示例用法(Sample Usage)

你可以将 InteractionalCanvas 小部件添加到你的小部件树中。以下是一个简单的示例:

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

  static const title = 'interactional_canvas 示例';

  [@override](/user/override)
  State<Demo> createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  late CanvasController controller;
  
  [@override](/user/override)
  void initState() {
    super.initState();
    controller = CanvasController();
  }
  
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text(Demo.title),
      ),
      body: InteractionalCanvas(
        controller: controller,
      ),
    );
  }
}

完整示例代码(Complete Sample Code)

查看 example 目录下的完整示例应用。

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:interactional_canvas/interactional_canvas.dart';
import 'package:random_color/random_color.dart';
import 'package:uuid/uuid.dart';

import 'circle.dart';
import 'menus.dart';

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final CanvasController controller = CanvasController();
  final gridSize = const Size.square(50);
  late List<Node<Circle>> nodes;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 生成随机节点
    final colors = RandomColor();
    nodes = List.generate(100, (index) {
      return Node<Circle>(
        key: ValueKey(const Uuid().v1()),
        label: 'Node $index',
        offset: Offset(
          Random().nextDouble() * 5000,
          Random().nextDouble() * 5000,
        ),
        size: Size.square(Random().nextDouble() * 200 + 100),
        child: Circle(color: colors.randomColor()),
      );
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      themeMode: ThemeMode.system,
      theme: ThemeData.light(useMaterial3: true),
      darkTheme: ThemeData.dark(useMaterial3: true),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('交互式画布示例'),
          centerTitle: false,
        ),
        body: Column(
          children: [
            Menus(controller: controller),
            Expanded(
              child: Stack(
                children: [
                  InteractionalCanvas(
                    drawVisibleOnly: true,
                    controller: controller,
                    gridSize: gridSize,
                    nodes: nodes,
                    onSelect: (selection) {
                      for (final node in selection) {
                        node.update(child: node.child.update(color: Colors.blue));
                      }
                    },
                    onDeselect: (selection) {
                      for (final node in selection) {
                        node.update(child: node.child.update(color: RandomColor().randomColor()));
                      }
                    },
                  ),
                  const Positioned(
                    right: 10,
                    top: 10,
                    width: 300,
                    height: 300,
                    child: IgnorePointer(
                      child: Text(
                        "提示:\n"
                        "1. 按住空格键并拖动以移动视口。\n"
                        "2. 按住 Shift 键并调整节点大小以保持比例。\n"
                        "3. 按住 Shift 键以选择多个节点。\n"
                        "4. 使用箭头键移动选中的节点。\n"
                        "5. 按住 Shift 键并按箭头键以快速移动选中的节点。",
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


interactional_canvas 是一个用于 Flutter 的交互式画布插件,允许你在画布上进行绘制和交互。它提供了触摸、缩放、平移等交互功能,非常适合用于创建绘图应用、图表工具或其他需要用户交互的图形界面。

以下是使用 interactional_canvas 的基本步骤和示例代码:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 interactional_canvas 依赖:

dependencies:
  flutter:
    sdk: flutter
  interactional_canvas: ^0.1.0  # 请查看最新版本

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

2. 导入包

在你的 Dart 文件中导入 interactional_canvas 包:

import 'package:interactional_canvas/interactional_canvas.dart';

3. 使用 InteractionalCanvas

InteractionalCanvas 是一个可以嵌入到 Flutter 应用中的画布组件。你可以通过 InteractionalCanvasController 来控制画布的缩放、平移和绘制。

以下是一个简单的示例,展示如何在画布上绘制一些形状并进行交互:

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

class InteractiveCanvasExample extends StatefulWidget {
  @override
  _InteractiveCanvasExampleState createState() => _InteractiveCanvasExampleState();
}

class _InteractiveCanvasExampleState extends State<InteractiveCanvasExample> {
  InteractionalCanvasController _controller;

  @override
  void initState() {
    super.initState();
    _controller = InteractionalCanvasController();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Interactive Canvas Example'),
      ),
      body: InteractionalCanvas(
        controller: _controller,
        onDraw: (Canvas canvas, Size size) {
          // 在这里进行绘制
          final paint = Paint()
            ..color = Colors.blue
            ..style = PaintingStyle.fill;

          // 绘制一个矩形
          canvas.drawRect(Rect.fromLTWH(50, 50, 100, 100), paint);

          // 绘制一个圆形
          canvas.drawCircle(Offset(200, 200), 50, paint);
        },
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: InteractiveCanvasExample(),
));

4. 控制画布

InteractionalCanvasController 提供了一些方法来控制画布的缩放、平移和重置:

  • zoom(double scale): 缩放画布。
  • pan(Offset offset): 平移画布。
  • reset(): 重置画布到初始状态。

你可以在按钮或其他交互元素中调用这些方法来控制画布的行为。例如:

FloatingActionButton(
  onPressed: () {
    _controller.reset();
  },
  child: Icon(Icons.refresh),
),
回到顶部