Flutter浮动操作按钮插件flutter_floaty的使用
Flutter浮动操作按钮插件flutter_floaty的使用
flutter_floaty
是一个用于在Flutter中创建可自定义、可拖动和动画浮动按钮的插件。本文将介绍如何使用这个插件,并提供一些示例代码。
特性
- 可自定义的浮动按钮
- 拖动时平滑动画
- 不同形状和大小
- 可更改背景颜色
- 可选阴影效果
- 辅助功能支持
- 使用
isVisible
属性控制可见性 - 鼠标悬停功能
- 固有边界
示例
基本浮动按钮
这是一个简单的带有文本和圆角的浮动按钮。
// 设置小部件可拖动的确切边界
final boundaries = Rect.fromLTWH(
0,
0,
MediaQuery.of(context).size.width,
MediaQuery.of(context).size.height * 0.75,
);
FlutterFloaty(
intrinsicBoundaries: boundaries,
width: 200,
height: 50,
builder: (context) => const Text(
'Flutter Floaty 🎉',
style: TextStyle(color: Colors.white),
),
backgroundColor: Colors.blue,
onDragBackgroundColor: Colors.blueAccent,
borderRadius: 10,
growingFactor: 1.3,
)
带图标的圆形浮动按钮
一个带有图标在中心的圆形按钮。
FlutterFloaty(
width: 60,
height: 60,
initialX: 100,
initialY: 300,
builder: (context) => const Icon(
Icons.add,
color: Colors.white,
),
backgroundColor: Colors.green,
onDragBackgroundColor: Colors.greenAccent,
borderRadius: 30,
growingFactor: 1.3,
)
带文本的方形浮动按钮
一个方形按钮,中间带有文本。
FlutterFloaty(
width: 100,
height: 100,
initialX: 200,
initialY: 200,
builder: (context) => const Center(
child: Text(
'Square',
style: TextStyle(color: Colors.white),
),
),
backgroundColor: Colors.red,
onDragBackgroundColor: Colors.redAccent,
borderRadius: 0,
)
带表情符号的圆形浮动按钮
一个显示表情符号的圆形按钮。
FlutterFloaty(
width: 80,
height: 80,
initialX: 250,
initialY: 400,
builder: (context) => const Center(
child: Text(
'😊',
style: TextStyle(fontSize: 32),
),
),
backgroundColor: Colors.purple,
onDragBackgroundColor: Colors.purpleAccent,
borderRadius: 40,
)
带阴影的浮动按钮
一个带有阴影效果的按钮。
FlutterFloaty(
width: 150,
height: 50,
initialX: 50,
initialY: 500,
builder: (context) => const Text(
'Shadow Floaty',
style: TextStyle(color: Colors.white),
),
backgroundColor: Colors.orange,
onDragBackgroundColor: Colors.orangeAccent,
borderRadius: 25,
shadow: BoxShadow(
color: Colors.black.withOpacity(0.5),
spreadRadius: 5,
blurRadius: 10,
offset: const Offset(0, 3),
),
)
复杂示例
以下是一个更复杂的示例,展示了多个浮动按钮的组合。
import 'package:flutter/material.dart';
import 'package:flutter_floaty/flutter_floaty.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
static const backgroundColor = Color(0xFFF1EFE7);
bool isPlaying = false;
double progress = 0;
Duration elapsed = Duration.zero;
final Duration totalDuration = const Duration(minutes: 3);
void togglePlayPause() {
setState(() {
isPlaying = !isPlaying;
});
if (isPlaying) {
_startProgress();
} else {
_stopProgress();
}
}
void _startProgress() {
Future.doWhile(() async {
await Future<void>.delayed(const Duration(seconds: 1));
if (!isPlaying) return false;
setState(() {
elapsed += const Duration(seconds: 1);
progress = elapsed.inSeconds / totalDuration.inSeconds;
});
return elapsed < totalDuration;
});
}
void _stopProgress() {}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: backgroundColor,
appBar: AppBar(
centerTitle: true,
title: const Text('FlutterFloaty Example'),
backgroundColor: backgroundColor,
),
body: Stack(
children: [
// Music Player Control with Progress Bar
FlutterFloaty(
width: 300,
height: 150,
initialX: 50,
initialY: 150,
builder: (context) => Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButton(
icon: Icon(
isPlaying ? Icons.pause : Icons.play_arrow,
color: Colors.white,
size: 36,
),
onPressed: togglePlayPause,
),
const SizedBox(width: 20),
const Text(
'Now Playing: Flutter Beats',
style: TextStyle(color: Colors.white),
),
],
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: LinearProgressIndicator(
value: progress,
color: Colors.red,
backgroundColor: Colors.grey,
),
),
const SizedBox(height: 8),
Text(
'${elapsed.inMinutes}:${(elapsed.inSeconds % 60).toString().padLeft(2, '0')} / ${totalDuration.inMinutes}:${(totalDuration.inSeconds % 60).toString().padLeft(2, '0')}',
style: const TextStyle(color: Colors.white),
),
],
),
onDragBackgroundColor: Colors.black87,
),
// Picture-in-Picture Video
FlutterFloaty(
width: 200,
height: 150,
initialX: 100,
initialY: 350,
builder: (context) => Container(
decoration: BoxDecoration(
color: Colors.black,
borderRadius: BorderRadius.circular(10),
image: const DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(
'https://i3.ytimg.com/vi/erLk59H86ww/maxresdefault.jpg',
),
),
),
child: const Center(
child: Icon(
Icons.play_circle_fill,
color: Colors.white,
size: 50,
),
),
),
onDragBackgroundColor: Colors.black54,
),
FlutterFloaty(
width: 70,
height: 70,
builder: (context) => Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
image: DecorationImage(
image: NetworkImage(
'https://avatars.githubusercontent.com/u/9919?s=280&v=4',
),
fit: BoxFit.cover,
),
),
),
backgroundColor: Colors.transparent,
onDragBackgroundColor: Colors.transparent,
borderRadius: 35,
),
FlutterFloaty(
width: 200,
height: 50,
builder: (context) => const Text(
'Flutter Floaty 🎉',
style: TextStyle(color: Colors.white),
),
backgroundColor: Colors.blue,
onDragBackgroundColor: Colors.blueAccent,
),
FlutterFloaty(
width: 100,
height: 100,
initialX: 200,
initialY: 200,
builder: (context) => const Center(
child: Text(
'Square',
style: TextStyle(color: Colors.white),
),
),
backgroundColor: Colors.red,
onDragBackgroundColor: Colors.redAccent,
borderRadius: 0,
),
FlutterFloaty(
width: 60,
height: 60,
initialX: 100,
initialY: 300,
builder: (context) => const Icon(
Icons.add,
color: Colors.white,
),
backgroundColor: Colors.green,
onDragBackgroundColor: Colors.greenAccent,
borderRadius: 30,
),
FlutterFloaty(
width: 70,
height: 70,
builder: (context) => const Icon(
Icons.person,
size: 55,
),
backgroundColor: Colors.transparent,
onDragBackgroundColor: Colors.transparent,
borderRadius: 35,
),
],
),
);
}
}
参数说明
以下是 FlutterFloaty
小部件使用的参数:
- builder:
WidgetBuilder
- 显示在可拖动区域内的内容生成器函数。 - initialX:
double
- 小部件的初始水平位置。 - initialY:
double
- 小部件的初始垂直位置。 - width:
double
- 小部件的初始宽度。 - height:
double
- 小部件的初始高度。 - backgroundColor:
Color
- 小部件的初始颜色。 - onDragBackgroundColor:
Color
- 小部件被拖动时的背景颜色。 - borderRadius:
BorderRadius
- 容器的边框半径。 - growingFactor:
double
- 拖动时小部件增长的比例因子。 - margin:
EdgeInsetsGeometry?
- 容器的外边距。 - padding:
EdgeInsetsGeometry?
- 容器的内边距。 - shape:
BoxShape?
- 容器的形状。 - shadow:
BoxShadow?
- 容器的阴影。 - scale:
double
-Transform.scale
小部件的比例。 - onTap:
VoidCallback?
- 点击小部件时的回调。 - onHover:
VoidCallback?
- 用户鼠标悬停时的回调。 - isVisible:
bool?
- 根据状态隐藏或显示小部件。 - intrinsicBoundaries:
Rect?
- 确定小部件可拖动的边界。 - enableAnimation:
bool?
- 启用拖动时的小部件增长效果。 - onPausePlaceHolder:
Widget?
- 拖动结束时显示的占位符小部件生成器。
开始使用
- 克隆仓库:
git clone https://github.com/jordyhers/flutter_floaty.git
- 导航到项目目录:
cd flutter_floaty
- 安装依赖:
flutter pub get
- 运行项目:
flutter run
贡献
欢迎贡献!请随时提交拉取请求或打开问题。
许可证
该项目采用 MIT 许可证。详见 LICENSE 文件。
集成测试
非常优秀的 Flutter 插件使用 [fluttium][fluttium_link] 进行集成测试。这些测试位于面向前端的包 flutter_floaty
示例中。
要运行集成测试,请从项目的根目录执行以下命令:
cd flutter_floaty/example
fluttium test flows/test_platform_name.yaml
以上内容详细介绍了 `flutter_floaty` 插件的使用方法,并提供了完整的示例代码和参数说明。希望对你有所帮助!
更多关于Flutter浮动操作按钮插件flutter_floaty的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复