Flutter可旋转覆盖层插件rotatable_overlay的使用
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: 如果
shouldSnapOnEnd
为true
,捕捉动画持续时间。 - shouldUseRelativeSnapDuration: 是否根据相对角度计算捕捉动画的持续时间。
- snapCurve: 捕捉动画曲线。
- onSnap: 角度捕捉时调用的回调函数。
- onAngleChanged: 角度变化时调用的回调函数。
- onAngleChangedPanEnd: 拖动手势结束时调用的回调函数。
- onSnapAnimationEnd: 动画结束时调用的回调函数。
示例图片
联系作者
如果你发现任何bug或有新功能的想法,请发送邮件给我!👋
更多关于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();
}
}
代码解释:
- 依赖引入:在
pubspec.yaml
中添加rotatable_overlay
依赖。 - 主应用:创建一个基本的Flutter应用,包含一个按钮用于显示覆盖层。
- 覆盖层显示:
- 使用
OverlayEntry
来创建和管理覆盖层。 - 使用
RotatableOverlay
作为覆盖层的内容,通过layerLink
和offset
参数来定位覆盖层。 - 覆盖层包含一个关闭按钮,点击后移除覆盖层。
- 使用
- Overlay管理:
- 使用
Overlay.of(context)!.insert(_overlayEntry!)
来插入覆盖层。 - 在
dispose
方法中移除覆盖层以防止内存泄漏。
- 使用
这个示例展示了如何在Flutter中集成和使用rotatable_overlay
插件来创建一个可旋转和拖动的覆盖层。你可以根据需要进一步自定义和扩展这个示例。