Flutter图形变换插件box_transform的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter图形变换插件box_transform的使用

插件简介

Box Transform 是一个纯 Dart 的基础包,它允许您在不依赖 Flutter 的情况下,编程式地处理盒子的缩放和拖动。它提供了高度灵活的、可编程缩放和拖动的盒子,可以在任何 Dart 项目中使用。

Banner

特性

  • 📏 尺寸限制:设置最大和最小约束,以确保在调整大小时盒子保持在特定边界内。
  • 🔁 翻转机制:当调整大小达到极限值时,提供高级的位置翻转。
  • 🔒 拖动限制:指定限制框,以保持您的可变形盒子在特定区域内。
  • 🎨 灵活的缩放模式:选择四种不同的缩放模式,以获得更灵活的缩放方式。
  • 📍 可自定义的锚点:定义调整大小的角柄,以在调整大小时锚定盒子的不同部分。
  • 🚀 易于集成:轻松将 Box Transform 集成到您的 Dart 或 Flutter 项目中。

快速开始

您可以访问 Getting Started 页面来开始使用 Box Transform。

示例应用

文档

文档地址:https://docs.page/hyper-designed/box_transform

贡献

请参阅 CONTRIBUTING.mdDEVELOPMENT.md 获取更多信息。

作者


Birju Vachhani

Saad Ardati

加入我们的 Discord 服务器获取更多帮助和支持:https://discord.gg/yrahEhCqTJ

使用示例

缩放一个盒子

import 'package:box_transform/box_transform.dart';

void main() {
  final Box rect = Box.fromLTWH(50, 50, 100, 100);

  final ResizeResult result = BoxTransformer.resize(
    handle: HandlePosition.bottomRight, // 正在被拖动的手柄
    initialRect: rect,
    initialLocalPosition: Vector2.zero(),
    localPosition: Vector2.zero(),
    resizeMode: ResizeMode.freeform,
    initialFlip: Flip.none,
  );

  print(result.rect); // 新的矩形
}

移动一个盒子

import 'package:box_transform/box_transform.dart';

void main() {
  final Box rect = Box.fromLTWH(50, 50, 100, 100);
  final MoveResult result = BoxTransformer.move(
    initialRect: rect,
    initialLocalPosition: Vector2.zero(),
    localPosition: Vector2.zero(),
  );

  print(result.position); // 盒子的新位置
}

完整示例 Demo

以下是一个完整的 Flutter 示例,展示了如何在 Flutter 应用中使用 box_transform 插件进行图形变换:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Box Transform Example')),
        body: BoxTransformDemo(),
      ),
    );
  }
}

class BoxTransformDemo extends StatefulWidget {
  @override
  _BoxTransformDemoState createState() => _BoxTransformDemoState();
}

class _BoxTransformDemoState extends State<BoxTransformDemo> {
  Box _rect = Box.fromLTWH(50, 50, 100, 100);
  Offset _position = Offset.zero;

  void _resizeBox(HandlePosition handle, Offset dragDelta) {
    final ResizeResult result = BoxTransformer.resize(
      handle: handle,
      initialRect: _rect,
      initialLocalPosition: Offset.zero,
      localPosition: dragDelta,
      resizeMode: ResizeMode.freeform,
      initialFlip: Flip.none,
    );

    setState(() {
      _rect = result.rect;
    });
  }

  void _moveBox(Offset dragDelta) {
    final MoveResult result = BoxTransformer.move(
      initialRect: _rect,
      initialLocalPosition: Offset.zero,
      localPosition: dragDelta,
    );

    setState(() {
      _position = result.position;
    });
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanUpdate: (details) {
        final Offset dragDelta = details.delta;
        _resizeBox(HandlePosition.bottomRight, dragDelta);
        _moveBox(dragDelta);
      },
      child: CustomPaint(
        size: Size.infinite,
        painter: BoxPainter(_rect, _position),
      ),
    );
  }
}

class BoxPainter extends CustomPainter {
  final Box box;
  final Offset position;

  BoxPainter(this.box, this.position);

  @override
  void paint(Canvas canvas, Size size) {
    final Paint paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.stroke
      ..strokeWidth = 2.0;

    final Rect rect = Rect.fromLTWH(box.left + position.dx, box.top + position.dy, box.width, box.height);
    canvas.drawRect(rect, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return true;
  }
}

这个示例展示了如何在一个 Flutter 应用中使用 box_transform 插件进行图形的缩放和移动操作。通过手势识别器(GestureDetector),用户可以通过拖动手势来调整图形的大小和位置。

希望这些信息能帮助您更好地理解和使用 box_transform 插件!如果有任何问题,欢迎随时提问。


更多关于Flutter图形变换插件box_transform的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图形变换插件box_transform的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,作为IT专家,我可以为你提供一个关于如何在Flutter中使用box_transform插件进行图形变换的代码示例。box_transform插件允许你应用各种2D变换(如旋转、缩放、平移等)到Flutter的Widget上。以下是一个基本的示例,展示如何使用这个插件。

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

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

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

接下来,你可以在你的Flutter应用中使用BoxTransform来进行图形变换。以下是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Box Transform Example'),
        ),
        body: Center(
          child: BoxTransformExample(),
        ),
      ),
    );
  }
}

class BoxTransformExample extends StatefulWidget {
  @override
  _BoxTransformExampleState createState() => _BoxTransformExampleState();
}

class _BoxTransformExampleState extends State<BoxTransformExample> with SingleTickerProviderStateMixin {
  double _rotateAngle = 0.0;
  double _scaleX = 1.0;
  double _scaleY = 1.0;
  double _translateX = 0.0;
  double _translateY = 0.0;

  void _applyTransformations() {
    setState(() {
      // 这里你可以应用你想要的变换
      _rotateAngle += 10.0;  // 每次增加10度旋转
      _scaleX *= 1.1;        // 每次放大10%
      _scaleY *= 1.1;
      _translateX += 10.0;   // 每次沿X轴平移10单位
      _translateY += 10.0;   // 每次沿Y轴平移10单位

      // 为了避免无限放大和平移,可以在某个点重置变换
      if (_scaleX > 5 || _scaleY > 5 || _translateX > 200 || _translateY > 200) {
        _scaleX = 1.0;
        _scaleY = 1.0;
        _translateX = 0.0;
        _translateY = 0.0;
        _rotateAngle = 0.0;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        BoxTransform(
          transform: Matrix4.identity()
            ..setEntry(3, 2, 0.001) // 设置透视
            ..rotateY(_rotateAngle) // 绕Y轴旋转
            ..scale(_scaleX, _scaleY) // 缩放
            ..translate(_translateX, _translateY, 0), // 平移
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Transformed Box',
                style: TextStyle(color: Colors.white),
              ),
            ),
          ),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _applyTransformations,
          child: Text('Apply Transformations'),
        ),
      ],
    );
  }
}

在这个示例中,我们创建了一个Flutter应用,其中包含一个可以通过按钮应用变换的蓝色盒子。变换包括旋转、缩放和平移。BoxTransform组件使用Matrix4对象来定义变换,你可以通过调用Matrix4的方法来设置不同的变换参数。

每次点击按钮时,都会调用_applyTransformations方法来更新变换参数,并触发UI重建以应用新的变换。

希望这个示例能帮助你理解如何在Flutter中使用box_transform插件进行图形变换。如果你有更多问题或需要进一步的帮助,请随时提问!

回到顶部