Flutter可旋转覆盖层插件rotatable_overlay的使用

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

Flutter可旋转覆盖层插件rotatable_overlay的使用

RotatableOverlay 插件简介

RotatableOverlay 是一个用于使子控件可以通过拖动中心进行旋转的 Flutter 插件。 通过这个插件,你可以创建一个可以自定义旋转角度和动画效果的旋转覆盖层。

使用示例

下面是一个完整的示例代码,展示了如何使用 RotatableOverlay 插件来创建一个可以旋转的绿色矩形,并在旋转过程中显示方向指示文字。

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: SafeArea(
          child: Center(
            child: RotatableOverlay(
              snaps: [
                Angle.degrees(0),
                Angle.degrees(90),
                Angle.degrees(180),
                Angle.degrees(270),
              ],
              snapDelta: Angle.degrees(5),
              shouldSnapOnEnd: true,
              shouldUseRelativeSnapDuration: true,
              child: Stack(
                alignment: Alignment.center,
                children: [
                  Container(
                    height: 150,
                    width: 150,
                    color: Colors.green,
                  ),
                  Positioned(
                    top: 0,
                    child: Text('N',
                        style: TextStyle(
                            fontSize: 18, fontWeight: FontWeight.bold)),
                  Positioned(
                    right: 0,
                    child: Text('E',
                        style: TextStyle(
                            fontSize: 18, fontWeight: FontWeight.bold)),
                  ),
                  Positioned(
                    left: 0,
                    child: Text('W',
                        style: TextStyle(
                            fontSize: 18, fontWeight: FontWeight.bold)),
                  ),
                  Positioned(
                    bottom: 0,
                    child: Text('S',
                        style: TextStyle(
                            fontSize: 18, fontWeight: FontWeight.bold)),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

参数说明

  • child: 子控件,将被旋转。
  • initialRotation: 初始旋转角度。
  • snaps: 要捕捉的角度列表。
  • snapDelta: 捕捉角度的距离阈值。
  • shouldSnapOnEnd: 如果为 true,停止拖动时会自动捕捉到最近的角度。
  • snapDuration: 如果 shouldSnapOnEndtrue,捕捉动画持续时间。
  • shouldUseRelativeSnapDuration: 是否根据相对角度计算捕捉动画的持续时间。
  • snapCurve: 捕捉动画曲线。
  • onSnap: 角度捕捉时调用的回调函数。
  • onAngleChanged: 角度变化时调用的回调函数。
  • onAngleChangedPanEnd: 拖动手势结束时调用的回调函数。
  • onSnapAnimationEnd: 动画结束时调用的回调函数。

示例图片

rotatable_overlay_example

联系作者

如果你发现任何bug或有新功能的想法,请发送邮件给我!👋

📧 riffert.daniel@gmail.com


更多关于Flutter可旋转覆盖层插件rotatable_overlay的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可旋转覆盖层插件rotatable_overlay的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用rotatable_overlay插件的一个基本示例。这个插件允许你创建一个可以旋转和拖动的覆盖层(Overlay)。

首先,你需要在你的pubspec.yaml文件中添加rotatable_overlay依赖:

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

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

接下来是一个完整的示例代码,展示如何使用rotatable_overlay插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Rotatable Overlay Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  OverlayEntry? _overlayEntry;
  final LayerLink _layerLink = LayerLink();
  final GlobalKey _overlayKey = GlobalKey();

  void _showOverlay() {
    final RenderBox? overlayBox = _overlayKey.currentContext?.findRenderObject();
    final Offset overlayPosition = overlayBox?.localToGlobal(Offset.zero) ?? Offset.zero;

    _overlayEntry = OverlayEntry(
      builder: (context) => RotatableOverlay(
        layerLink: _layerLink,
        offset: overlayPosition,
        child: Container(
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.circular(10),
            boxShadow: [
              BoxShadow(
                color: Colors.black.withOpacity(0.5),
                spreadRadius: 5,
                blurRadius: 7,
                offset: Offset(0, 3), // changes position of shadow
              ),
            ],
          ),
          padding: EdgeInsets.all(16),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Text('This is a rotatable overlay!'),
              ElevatedButton(
                onPressed: () {
                  // Close the overlay when button is pressed
                  _overlayEntry?.remove();
                  _overlayEntry = null;
                },
                child: Text('Close'),
              ),
            ],
          ),
        ),
      ),
    );

    Overlay.of(context)!.insert(_overlayEntry!);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Rotatable Overlay Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Press the button to show the rotatable overlay',
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _showOverlay,
              child: Text('Show Overlay'),
            ),
          ],
        ),
      ),
      overlay: _overlayEntry != null ? Overlay.from(key: _overlayKey, link: _layerLink) : null,
    );
  }

  @override
  void dispose() {
    _overlayEntry?.remove();
    super.dispose();
  }
}

代码解释:

  1. 依赖引入:在pubspec.yaml中添加rotatable_overlay依赖。
  2. 主应用:创建一个基本的Flutter应用,包含一个按钮用于显示覆盖层。
  3. 覆盖层显示
    • 使用OverlayEntry来创建和管理覆盖层。
    • 使用RotatableOverlay作为覆盖层的内容,通过layerLinkoffset参数来定位覆盖层。
    • 覆盖层包含一个关闭按钮,点击后移除覆盖层。
  4. Overlay管理
    • 使用Overlay.of(context)!.insert(_overlayEntry!)来插入覆盖层。
    • dispose方法中移除覆盖层以防止内存泄漏。

这个示例展示了如何在Flutter中集成和使用rotatable_overlay插件来创建一个可旋转和拖动的覆盖层。你可以根据需要进一步自定义和扩展这个示例。

回到顶部