美文网首页
Flutter - 写一个全局悬浮按钮

Flutter - 写一个全局悬浮按钮

作者: 水煮杰尼龟 | 来源:发表于2023-11-23 08:20 被阅读0次

WDScreenButton:打造自定义可拖动悬浮按钮

在移动应用开发中,悬浮按钮是一种常见的交互元素,它可以提供快速便捷的操作入口。然而,Flutter框架并未提供直接支持悬浮按钮拖动功能的组件。为了解决这一问题,我开发了WDScreenButton,它能够轻松实现自定义可拖动的悬浮按钮,并且提供了丰富的定制化选项。(用gpt又写了一篇)

1. 灵活的定制化

WDScreenButton允许开发者根据自身应用的需求进行灵活定制,包括按钮位置、初始显示状态、按钮样式等。通过简单的配置,开发者可以轻松创建出符合应用设计风格的悬浮按钮,提升用户体验和应用整体美感。

2. 拖动交互支持

WDScreenButton支持拖动交互,用户可以通过触摸拖动按钮的方式调整按钮位置,从而更好地适配不同屏幕尺寸和用户习惯。这种直观的交互方式不仅增加了用户与应用的互动性,同时也提升了用户对应用功能的操作效率。

3. 完整代码


import 'package:flutter/material.dart';

typedef WDScreenButtonCallBack = void Function();

class WDScreenButton {

  static OverlayEntry? _overlayEntry;
  ///是否显示
  static bool isShow = false;
  static WDScreenButtonCallBack? _callBack;
  static GlobalKey<NavigatorState>? _globalKey;

  static double _dx = 30;
  static double _dy = 100;
  static Widget? _buttonChild;
  ///是否初始化
  static bool isInit = false;

  ///显示/隐藏按钮
  static changeStatus(bool status){
    isShow = status;
    Future.delayed(Duration(milliseconds: 330)).then((value) {
      _overlayEntry?.markNeedsBuild();
    });
  }
  static initConfig(GlobalKey<NavigatorState> globalKey,{double left = 30, double top = 100,
    bool isShowBtn = false,Widget? buttonChild,WDScreenButtonCallBack? callBack}){
    if(isInit){
      return;
    }
    isShow = isShowBtn;
    _callBack = callBack;
    _dx = left;
    _dy = top;
    _buttonChild = buttonChild;
    _globalKey = globalKey;
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _init();
    });
  }

  ///初始化
  static _init()  {
    _overlayEntry?.remove();
    _overlayEntry = null;
    _overlayEntry = OverlayEntry(
        builder: (BuildContext context) => Positioned(
          top:  _dy,
          left: _dx,
          child: GestureDetector(
              onTap: () {
                if (_callBack != null) {
                  _callBack!();
                }
              },
              child: Offstage(
                offstage: !isShow,
                child: Draggable(
                    onDragUpdate: (DragUpdateDetails details){
                    },
                    onDragEnd: (DraggableDetails details) {
                      ///拖动结束
                      _dx = details.offset.dx;
                      _dy = details.offset.dy;
                      if (_dx < 30) {
                        _dx = 30;
                      } else if (_dx > MediaQuery.of(context).size.width - 30) {
                        _dx = MediaQuery.of(context).size.width-30;
                      }
                      if (_dy < 100) {
                        _dy = 100;
                      }else if (_dy > MediaQuery.of(context).size.height - 100) {
                        _dy = MediaQuery.of(context).size.height - 100;
                      }
                      _overlayEntry?.markNeedsBuild();
                    },
                    childWhenDragging: SizedBox.shrink(),
                    feedback: _buttonChild ?? Icon(Icons.pest_control_sharp,size: 40,color: Colors.blueAccent,),
                    child:_buttonChild ?? Icon(Icons.pest_control_sharp,size: 40,color: Colors.blueAccent)),
              )
          ),
        )
    );
    if (_globalKey?.currentState?.overlay != null) {
      _globalKey!.currentState!.overlay!.insert(_overlayEntry!);
      isInit = true;
    }
  }


}

4. 如何使用WDScreenButton

  1. 在需要使用的页面引入WDScreenButton:
import 'xxxx/wd_screen_button.dart';
  1. 在页面初始化阶段进行配置:
WDScreenButton.initConfig(
  globalKey,
  left: 30,
  top: 100,
  isShowBtn: true,
  buttonChild: Icon(Icons.add, size: 36, color: Colors.white),
  callBack: () {
    // 点击按钮触发的操作
  },
);

5. 结语

WDScreenButton为Flutter开发者提供了一种简单、灵活的方式来创建自定义可拖动悬浮按钮,为应用增添了更多的交互元素和个性化定制空间。我相信,WDScreenButton将成为您开发畅、具有吸引力的应用界面的得力助手。

相关文章

  • iOS - 添加一个全局悬浮按钮

    iOS - 添加一个全局悬浮按钮 iOS - 添加一个全局悬浮按钮

  • iOS 全局悬浮按钮

    1.创建按钮,加在UIApplication 的keyWindow上; 2.button的懒加载 3.改变位置 移...

  • flutter中的一些小坑合集

    1.修改主题按钮颜色(buttonColor) flutter-io的教程上关于修改全局主题中的按钮颜色是这样写的...

  • flutter 滚动隐藏悬浮按钮

    flutter 滚动隐藏悬浮按钮 实现思路,当开始滚动的时候,执行动画让中间的悬浮按钮向右移动。当滚动结束的时候复...

  • vue实现拖动效果

    用于实现一些悬浮在右下角的可拖动的全局按钮

  • iOS - 添加一个全局悬浮按钮

    背景介绍 :在普通的iOS开发组中,一般测试机都不止一台,但是我们在开发的时候,不可能每台测试机时刻保持最新的代码...

  • 悬浮按钮

    FloatingActionButton 悬浮按钮 悬浮按钮时DesignSupport库的一个控件,可以帮助我们...

  • 安卓实现app全局按钮,类似360悬浮球

    安卓app内部实现一个全局的悬浮按钮,类似于360的悬浮球可在app内部所有界面显示。主要还是来源于网上搜索的,经...

  • 应用中全局悬浮的按钮

    碰到这个需求,需要在应用里面添加一个悬浮的按钮,一直处在屏幕的最上面,并且在特定的界面不显示,类似与苹果手机上的那...

  • 几句代码实现轻量级可拖动button

    有的时候的悬浮按钮并不需要一直在后台运行,而且写service的悬浮按钮的demo也很多,最近碰到一个需求,只要在...

网友评论

      本文标题:Flutter - 写一个全局悬浮按钮

      本文链接:https://www.haomeiwen.com/subject/vbswwdtx.html