Flutter艺术画板插件stack_art_board的使用

Flutter艺术画板插件stack_art_board的使用

stack_art_board 是一个用于在 Flutter 中创建艺术画板的插件。它允许添加任意小部件,并支持编辑、删除和改变图层顺序。

如何使用

开始使用

在你的 Flutter 项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  ...
  stack_art_board: <最新版本>

在你的库文件中添加以下导入语句:

import 'package:stack_art_board/stack_art_board.dart';

初始化StackArtBoard

// 引入必要的库
import 'package:stack_art_board/stack_art_board.dart';

// 创建控制器
final StackArtBoardController controller = StackArtBoardController();

// 使用StackArtBoard组件
StackArtBoard(
  // 设置唯一键
  stackArtBoardKey: UniqueKey(),
  // 绑定控制器
  controller: controller,
  // 配置画板参数
  artBoardConfig: ArtBoardConfig(
    // 容器大小
    containerSize: const Size(300, 300),
    // 画板大小
    artBoardSize: const Size(3000, 3000),
    // 工具图标宽度
    toolIconWidth: 20,
    // 边框宽度
    borderWidth: 5,
    // 边框颜色
    borderColor: Colors.black,
    // 旋转小部件
    rotateWidget: Container(color: Colors.orange),
    // 删除小部件
    deleteWidget: Container(color: Colors.purple),
  ),
  // 背景颜色
  background: Container(color: Colors.green),
),

添加自定义小部件

// 添加自定义小部件
controller.add(
  CustomCanvasItem(
    // 自定义小部件内容
    child: Container(
      color: Colors.red,
      child: const Center(
        child: Text('text'),
      ),
    ),
    // 小部件配置
    canvasConfig: CanvasConfig(
      size: const Size(600, 600),
      transform: Matrix4.identity(),
      allowUserInteraction: true,
    ),
  ),
);

添加带有透明区域的图像小部件

// 加载图像
final ByteData data = await rootBundle.load('assets/image.png');
final imageBytes = data.buffer.asUint8List();
final image = img_lib.decodeImage(imageBytes);
if (image == null) return;

// 添加带有透明区域的图像小部件
controller.add(
  TransparentBgImageCanvasItem(
    image: image,
    imageBytes: imageBytes,
    canvasConfig: CanvasConfig(
      size: Size(image.width.toDouble(), image.height.toDouble()),
      transform: Matrix4.identity(),
      allowUserInteraction: true,
    ),
  ),
);

所有画布操作

// 添加小部件
void add<T extends CanvasItem>(T item);

// 插入小部件
void insert<T extends CanvasItem>(T item, int index);

// 移除小部件
void remove(Key key);

// 保留指定小部件并移除其他所有小部件
void removeExcept(Key key);

// 检查是否包含指定小部件
bool contain(Key key);

// 清空所有小部件
void clear();

// 将小部件移动到最顶层
void moveToTop();

// 将小部件移动到最底层
void moveToBottom();

// 移动小部件的位置
void move(int oldIndex, int newIndex);

// 重置所有小部件
void reset();

// 释放资源
void dispose();

示例代码

以下是完整的示例代码,展示了如何使用 stack_art_board 插件。

import 'package:image/image.dart' as img_lib;

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:stack_art_board/stack_art_board.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final StackArtBoardController controller = StackArtBoardController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Stack Art Board Demo'),
      ),
      body: Center(
        child: StackArtBoard(
          stackArtBoardKey: UniqueKey(),
          controller: controller,
          artBoardConfig: ArtBoardConfig(
            containerSize: const Size(300, 300),
            artBoardSize: const Size(3000, 3000),
            toolIconWidth: 20,
            borderWidth: 5,
            borderColor: Colors.black,
            rotateWidget: Container(color: Colors.orange),
            deleteWidget: Container(color: Colors.purple),
          ),
          background: Container(color: Colors.green),
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      floatingActionButton: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          ElevatedButton(
            onPressed: () {
              controller.add(
                CustomCanvasItem(
                  child: Container(
                    color: Colors.red,
                    child: const Center(
                      child: Text('text'),
                    ),
                  ),
                  canvasConfig: CanvasConfig(
                    size: const Size(600, 600),
                    transform: Matrix4.identity(),
                    allowUserInteraction: true,
                  ),
                ),
              );
            },
            child: const Text('添加自定义画布'),
          ),
          ElevatedButton(
            onPressed: () async {
              final ByteData data = await rootBundle.load('assets/image.png');
              final imageBytes = data.buffer.asUint8List();
              final image = img_lib.decodeImage(imageBytes);
              if (image == null) return;
              controller.add(
                TransparentBgImageCanvasItem(
                  image: image,
                  imageBytes: imageBytes,
                  canvasConfig: CanvasConfig(
                    size: Size(image.width.toDouble(), image.height.toDouble()),
                    transform: Matrix4.identity(),
                    allowUserInteraction: true,
                  ),
                ),
              );
            },
            child: const Text('添加透明背景图像'),
          ),
          ElevatedButton(
            onPressed: () {
              controller.moveToTop();
            },
            child: const Text('移动到最顶层'),
          ),
          ElevatedButton(
            onPressed: () {
              controller.moveToBottom();
            },
            child: const Text('移动到最底层'),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter艺术画板插件stack_art_board的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter艺术画板插件stack_art_board的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 stack_art_board 插件在 Flutter 中创建艺术画板的示例代码。stack_art_board 是一个用于在 Flutter 中实现堆栈式画板功能的插件,允许用户在多个图层上进行绘图。

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

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

然后,运行 flutter pub get 来获取依赖。

接下来,是一个简单的示例代码,展示如何使用 stack_art_board 插件:

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

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

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

class StackArtBoardScreen extends StatefulWidget {
  @override
  _StackArtBoardScreenState createState() => _StackArtBoardScreenState();
}

class _StackArtBoardScreenState extends State<StackArtBoardScreen> {
  final GlobalKey<StackArtBoardState> _stackArtBoardKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Stack Art Board Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Expanded(
              child: StackArtBoard(
                key: _stackArtBoardKey,
                backgroundColor: Colors.white,
                onSave: (List<Uint8List> layers) async {
                  // 在这里保存图层数据,例如保存到文件或服务器
                  print('Layers saved: $layers');
                },
              ),
            ),
            SizedBox(height: 16),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[
                ElevatedButton(
                  onPressed: () {
                    _addShape(Shape.circle);
                  },
                  child: Text('Add Circle'),
                ),
                ElevatedButton(
                  onPressed: () {
                    _addShape(Shape.rectangle);
                  },
                  child: Text('Add Rectangle'),
                ),
                ElevatedButton(
                  onPressed: () {
                    _clearBoard();
                  },
                  child: Text('Clear Board'),
                ),
              ],
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _saveBoard();
        },
        tooltip: 'Save',
        child: Icon(Icons.save),
      ),
    );
  }

  void _addShape(Shape shape) {
    _stackArtBoardKey.currentState?.addShape(
      shape,
      color: Colors.blue,
      strokeWidth: 4.0,
    );
  }

  void _clearBoard() {
    _stackArtBoardKey.currentState?.clearBoard();
  }

  void _saveBoard() {
    _stackArtBoardKey.currentState?.saveBoard();
  }
}

在这个示例中:

  1. StackArtBoard 组件用于显示画板,并允许用户在其上进行绘图。
  2. 使用 _addShape 方法向画板添加圆形或矩形形状。
  3. _clearBoard 方法用于清空画板。
  4. _saveBoard 方法触发保存画板图层数据的操作,可以在 onSave 回调中处理保存逻辑。

请注意,stack_art_board 插件的具体 API 可能会随着版本更新而变化,因此请参考插件的官方文档以获取最新和最准确的 API 信息。

回到顶部