Flutter可移动组件插件flutter_moveable的使用

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

Flutter可移动组件插件flutter_moveable的使用

描述

flutter_moveable 是一个用于一对一视频或音频通话、消息头像等场景的对象可移动小部件。

示例图片

Message Head Style: heads

One to One Calling Style: one2onecalling

特性

  • 任意位置放置系统
  • 水平停靠放置系统
  • 垂直停靠放置系统
  • 任何中心侧边放置系统
  • 任何角落放置系统
  • 最近邻放置系统
  • 底部和顶部中心放置系统
  • 底部和顶部任意角落放置系统
  • 顶部和底部任意侧边放置系统
  • 顶部和底部任意角落放置系统
  • 左侧和右侧任意侧边放置系统
  • 左侧和右侧任意角落放置系统
  • 右侧和左侧任意侧边放置系统
  • 右侧和左侧任意角落放置系统

使用方法

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 flutter_moveable 插件:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false, // 隐藏调试横幅
      home: Scaffold(
        backgroundColor: Colors.black, // 背景颜色为黑色
        extendBody: true, // 扩展body到屏幕边缘
        extendBodyBehindAppBar: true, // 扩展body到appBar后面
        appBar: AppBar(
          elevation: 0, // 不显示阴影
          toolbarHeight: 0, // 高度为0
          backgroundColor: Colors.transparent, // 背景透明
          systemOverlayStyle: const SystemUiOverlayStyle(
            statusBarColor: Colors.transparent, // 状态栏透明
          ),
        ),
        body: Moveable( // 可移动组件
          alignment: Alignment.topRight, // 初始对齐方式:右上角
          type: MovingType.cornerSide, // 移动类型:角落侧边
          movedAnimationTime: 200, // 移动后的动画时间
          movingAnimationTime: 50, // 移动中的动画时间
          object: MoveableObject.rational(
            maxWidth: 60, // 最大宽度
            ratio: 1, // 宽高比
            margin: const EdgeInsets.only(top: 40), // 上边距
            builder: (dragging, child) { // 构建函数
              return Center(
                child: AnimatedContainer(
                  width: dragging ? 50 : 60, // 根据拖动状态设置宽度
                  clipBehavior: Clip.antiAlias, // 抗锯齿剪裁
                  decoration: const BoxDecoration(shape: BoxShape.circle), // 圆形装饰
                  duration: const Duration(milliseconds: 200), // 动画持续时间
                  child: child,
                ),
              );
            },
            child: Image.asset(
              "assets/images/img_avatar.png", // 头像图片路径
              fit: BoxFit.cover, // 图片填充方式
            ),
          ),
          child: const SizedBox(
            width: double.infinity, // 占满整个宽度
            height: double.infinity, // 占满整个高度
          ),
        ),
      ),
    );
  }
}

另一个示例代码如下:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false, // 隐藏调试横幅
      home: Scaffold(
        backgroundColor: Colors.black, // 背景颜色为黑色
        extendBody: true, // 扩展body到屏幕边缘
        extendBodyBehindAppBar: true, // 扩展body到appBar后面
        appBar: AppBar(
          elevation: 0, // 不显示阴影
          toolbarHeight: 0, // 高度为0
          backgroundColor: Colors.transparent, // 背景透明
          systemOverlayStyle: const SystemUiOverlayStyle(
            statusBarColor: Colors.transparent, // 状态栏透明
          ),
        ),
        body: Moveable( // 可移动组件
          alignment: Alignment.topRight, // 初始对齐方式:右上角
          type: MovingType.cornerSide, // 移动类型:角落侧边
          movedAnimationTime: 200, // 移动后的动画时间
          movingAnimationTime: 50, // 移动中的动画时间
          object: MoveableObject.rational(
            maxWidth: 120, // 最大宽度
            ratio: 1 / 1.5, // 宽高比
            margin: const EdgeInsets.only(
              top: 40,
              bottom: 16,
              left: 16,
              right: 16,
            ), // 四周边距
            builder: (dragging, child) { // 构建函数
              return Center(
                child: AnimatedContainer(
                  width: dragging ? 100 : 120, // 根据拖动状态设置宽度
                  clipBehavior: Clip.antiAlias, // 抗锯齿剪裁
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(16), // 圆角矩形装饰
                  ),
                  duration: const Duration(milliseconds: 200), // 动画持续时间
                  child: child,
                ),
              );
            },
            child: Image.asset(
              "assets/images/img_avatar.png", // 头像图片路径
              fit: BoxFit.cover, // 图片填充方式
            ),
          ),
          child: const SizedBox(
            width: double.infinity, // 占满整个宽度
            height: double.infinity, // 占满整个高度
          ),
        ),
      ),
    );
  }
}

更多关于Flutter可移动组件插件flutter_moveable的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可移动组件插件flutter_moveable的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 flutter_moveable 插件的简单示例代码。这个插件允许你在 Flutter 应用中创建可移动的组件。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_moveable: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的 Dart 文件中使用 flutter_moveable。以下是一个完整的示例,展示了一个可移动的矩形组件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Moveable Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Moveable Demo'),
        ),
        body: MoveableArea(
          child: Container(
            color: Colors.grey[200],
            height: double.infinity,
            width: double.infinity,
            child: MoveableObject(
              key: UniqueKey(),
              child: Container(
                width: 100,
                height: 100,
                color: Colors.blue,
                child: Center(
                  child: Text(
                    'Move Me',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ),
              feedback: Material(
                color: Colors.transparent,
                child: Container(
                  decoration: BoxDecoration(
                    border: Border.all(color: Colors.red, width: 2.0),
                  ),
                ),
              ),
              onDragStarted: () {
                print('Dragging started');
              },
              onDragEnded: (details) {
                print('Dragging ended at: ${details.offset}');
              },
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. MoveableArea 是一个可移动组件的容器,它允许其子组件在内部移动。
  2. MoveableObject 是你想要移动的组件。这里我们使用了一个蓝色的容器作为示例。
  3. feedback 参数用于定义拖动时的反馈效果。在这个例子中,我们使用了一个带有红色边框的透明容器。
  4. onDragStartedonDragEnded 是拖动开始和结束时的回调函数,可以用于处理拖动事件。

你可以根据需要调整组件的样式和回调函数,以满足你的应用需求。这个插件提供了丰富的功能和配置选项,详细信息可以参考其官方文档。

回到顶部