Flutter 可随意拖动按钮

实现这个功能主要用到了Stack、Positioned、Draggable等几个组件
直接上代码:

1.main.dart文件

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FloatBtn(),
    );
  }
}
  1. FloatBtn.dart 文件
import 'package:flutter/material.dart';

class FloatBtn extends StatefulWidget {
  FloatBtn({Key key}) : super(key: key);

  @override
  _FloatBtnState createState() => _FloatBtnState();
}

class _FloatBtnState extends State<FloatBtn> {
  
  Offset offsetA = Offset(20, kToolbarHeight + 100);//按钮的初始位置
  
  @override
  Widget build(BuildContext context) {

    final size = MediaQuery.of(context).size;
    final width = size.width;
    final height = size.height;

    return Scaffold(
       body: Stack(
         children:<Widget>[
          Positioned(
            left: offsetA.dx,
            top: offsetA.dy,
            child: Draggable(
                //创建可以被拖动的Widget
                child:  FloatingActionButton(
                  tooltip: 'Increment',
                  child: Icon(Icons.add), onPressed: () {},
                ),
                //拖动过程中的Widget
                feedback: FloatingActionButton(
                  tooltip: 'Increment',
                  child: Icon(Icons.add), onPressed: () {},
                ),
                //拖动过程中,在原来位置停留的Widget,设定这个可以保留原本位置的残影,如果不需要可以直接设置为Container()
                childWhenDragging: Container(),
                
                // FloatingActionButton(
                //   tooltip: 'Increment',
                //   child: Icon(Icons.add), onPressed: () {},
                // ),
                //拖动结束后的Widget
                onDraggableCanceled: (Velocity velocity, Offset offset) {
                  // 计算组件可移动范围  更新位置信息
                  setState(() {
                    var x = offset.dx;
                    var y = offset.dy;
                    if(offset.dx<0){
                      x = 20;
                    }

                    if(offset.dx>375){
                      x = 335;
                    }

                    if(offset.dy<kBottomNavigationBarHeight){
                      y = kBottomNavigationBarHeight;
                    }

                    if(offset.dy>height-100){
                      y = height - 100;
                    }

                    offsetA = Offset(x, y);
                  });

                }
              )
          )
         ]
       ),
    );
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 随着纯客户端到Hybrid技术,到RN&Weex,再到如今的Flutter技术,客户端实现技术不断前进。 在之前的...
    瑜小贤阅读 605评论 0 0
  • 如何安装 Flutter 请点击这里 1、Flutter 是什么? Flutter是一款移动应用程序SDK,包含框...
    大王叫我来巡山_Cong阅读 1,442评论 0 9
  • 阅读·Mark 006/100 书名:《人生就是边玩边学》作者:李欣频 这本书讲述了作者的创意之旅:意大利面具嘉年...
    小妞213阅读 360评论 0 1
  • 十年前,我可能做了人生非常大的一个转折,我退了学,离开了科大,远离了科研。 十年后,今年,又是一个轮回啊,我又在做...
    ipirate阅读 148评论 2 5
  • 周五快乐!辣椒和你问好,这周过的怎么样呢?水星、木星同时逆行,大家有没有晕车反应啊? 水土刑、日火刑、日土刑的影响...
    星姐倬伦阅读 585评论 0 0