Flutter提供了强大的拖拽控件,可以灵活定制,并且非常简单。下面作一个拖拽的案例。

Draggable Widget

Draggable控件负责就是拖拽,父层使用了Draggable,它的子元素就是可以拖动的,子元素可以实容器,可以是图片。用起来非常的灵活。

参数说明:

  • data: 是要传递的参数,在DragTarget里,会接受到这个参数。当然要在拖拽控件推拽到DragTarget的时候。
  • child:在这里放置你要推拽的元素,可以是容器,也可以是图片和文字。
  • feedback: 常用于设置推拽元素时的样子,在案例中当推拽的时候,我们把它的颜色透明度变成了50%。当然你还可以改变它的大小。
  • onDraggableCanceled:是当松开时的相应事件,经常用来改变推拽时到达的位置,改变时用setState来进行。
Draggable( //拖拽组件
data:widget.widgetColor,
child:Container(
width: 100.0,
height:100.0,
color: widget.widgetColor,
),
feedback:Container( //feedback:拖动控件时子元素的样子
width: 100.0,
height:100.0,
color: widget.widgetColor.withOpacity(0.5),
),
onDraggableCanceled:(Velocity velocity,Offset offset){ //松手的时候
setState(() {
this.offset = offset;
});
},
),

DragTarget Widget

DragTarget是用来接收拖拽事件的控件,当把Draggable放到DragTarget里时,他会接收Draggable传递过来的值,然后用生成器改变组件状态。

  • onAccept:当推拽到控件里时触发,经常在这里得到传递过来的值。
  • builder: 构造器,里边进行修改child值。
    DragTarget(
onAccept: (Color color){
_draggabColor = color;
},
builder: (context, candidateData, rejectedData){
return Container(
width: 200.0,
height: 200.0,
color: _draggableColor,
);
},
),

完整代码如下:

import 'package:flutter/material.dart';
import 'draggable_demo.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title:'Flutter Demo',
theme:ThemeData(
primarySwatch: Colors.blue
),
home:DraggableDemo()
);
}
}

draggable_demo.dart代码:

import 'package:flutter/material.dart';
import 'draggable_widget.dart'; class DraggableDemo extends StatefulWidget {
_DraggableDemoState createState() => _DraggableDemoState();
} class _DraggableDemoState extends State<DraggableDemo> {
Color _draggableColor = Colors.grey; @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('拖拽案例')),
body: Stack(
children: <Widget>[
DraggableWidget(
offset: Offset(80.0, 80.0),
widgetColor: Colors.tealAccent,
),
DraggableWidget(
offset: Offset(180.0, 80.0),
widgetColor: Colors.redAccent,
),
Center(
child: DragTarget(
onAccept: (Color color){
_draggableColor = color;
},
builder: (context, candidateData, rejectedData){
return Container(
width: 200.0,
height: 200.0,
color: _draggableColor,
);
},
),
),
],
),
);
}
}

draggable_widget.dart代码:

class DraggableWidget extends StatefulWidget {
final Offset offset; //位置
final Color widgetColor; //颜色
const DraggableWidget({Key key, this.offset, this.widgetColor}):super(key:key); _DraggableWidgetState createState() => _DraggableWidgetState();
} class _DraggableWidgetState extends State<DraggableWidget> {
Offset offset = Offset(0.0,0.0);
@override
void initState() {
super.initState();
offset = widget.offset;
} @override
Widget build(BuildContext context) {
return Positioned(
left: offset.dx,
top:offset.dy,
child: Draggable( //拖拽组件
data:widget.widgetColor,
child:Container(
width: 100.0,
height:100.0,
color: widget.widgetColor,
),
feedback:Container( //feedback:拖动控件时子元素的样子
width: 100.0,
height:100.0,
color: widget.widgetColor.withOpacity(0.5),
),
onDraggableCanceled:(Velocity velocity,Offset offset){ //松手的时候
setState(() {
this.offset = offset;
});
},
),
);
}
}

Flutter 拖拽控件Draggable的更多相关文章

  1. Flutter 拖拽控件Draggable看这一篇就够了

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Draggable系列组件可以让我们拖动组件. Dragg ...

  2. flutter Draggable Widget拖拽控件

    Draggable Widget Draggable控件负责就是拖拽,父层使用了Draggable,它的子元素就是可以拖动的,子元素可以实容器,可以是图片.用起来非常的灵活. 参数说明: data: ...

  3. 【C#/WPF】GridSplitter 分割布局,拖拽控件分隔栏以改变控件尺寸

    需求:界面由多部分控件组成,想要拖拽控件之间的分隔栏以改变尺寸. MainWindow.xaml: <Grid> <Grid.ColumnDefinitions> <Co ...

  4. Unity编辑器 - DragAndDrop拖拽控件

    Unity编辑器 - DragAndDrop拖拽控件 Unity编辑器的拖拽(DragAndDrop)在网上能找到的资料少,自己稍微研究了一下,写了个相对完整的案例,效果如下 代码: object d ...

  5. ios-将代码创建的视图控件放入拖拽控件的下面

    如图所示 图片是拖拽上去的imageView,橘黄色控件是在代码中创建的添加上去的,此时黄色view在imageView 上方 调用方法bringSubviewToFront:试图将imageView ...

  6. H5实现多图片预览上传,可点击可拖拽控件介绍

    版权声明:欢迎转载,请注明出处:http://blog.csdn.net/weixin_36380516 在做图片上传时发现一个蛮好用的控件,支持多张图片同时上传,可以点击选择图片,也可以将图片拖拽到 ...

  7. 拖拽控件java版

    Button vv = new Button("vvvv");  DragSource.getDefaultDragSource().createDefaultDragGestur ...

  8. 开发winform程序,在拖拽控件大小时,VS会卡死

    你可以看看你最近有没有装什么新的软件,比如说:有道词典就会与VS有冲突,导致卡死,可以把进程关闭.

  9. 【C#】自定义容器控件,设置界面控件,支持设计器拖入控件

    先上效果图: 1.先重写设置界面的控件功能: public partial class SetterControl : UserControl { public SetterControl() { I ...

随机推荐

  1. windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo

    设置方法 int nNetTimeout=10000;//10秒,    //设置发送超时    setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char *) ...

  2. BM(Berlekamp-Massey)算法

    线性递推的题目区域赛里还是挺多的,还是有必要学一下 ~ BM(Berlekamp-Massey)算法 ~ 有一个$n$阶线性递推$f$,想要计算$f(m)$,有一种常用的办法是矩阵快速幂,复杂度是$O ...

  3. 转 oracle数据库更新时间字段数据时的sql语句

    https://www.cnblogs.com/sun-rain/p/4921512.html ---Oracle数据库-时间函数 ---格式化时间插入update t_user u set u.mo ...

  4. [2019HDU多校第一场][HDU 6584][G. Meteor]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6584 题目大意:求所有满足\(0<\frac{p}{q}\leq1, gcd(p,q)=1,p\ ...

  5. tomcat——web.xml

    本机tomcat位置:D:\tomcat7\apache-tomcat-7.0.61 web.xml web工程的部署描述文件.在web工程中此文件并不是必须有的. 位置:D:\tomcat7\apa ...

  6. IDEA创建类似于Eclipse的source folder

    1.新建普通文件夹目录directory 2.当前Module右键Open Mudule Settings(F12) 3.选中新建的文件夹并单击上面的Sources,看到文件夹颜色变化即成功.

  7. codeforces533E

    Correcting Mistakes CodeForces - 533E Analyzing the mistakes people make while typing search queries ...

  8. c++ 容器切片反转次序(不拷贝到新容器)

    // rotate algorithm example #include <iostream> // cout #include <algorithm> // rotate # ...

  9. C语言问答九问

    C语言问题观: 一.环境搭建问题:linux,(可以是w10下linux子系统):vim(notepad++),gcc编译器,gdb调试器,make自动编译工具,ddd分析工具和valgrind分析工 ...

  10. WGAN实验环境搭建

    "TensorFlow在Windows上支持Python 3.5.x和3.6.x." 因此,您无法在Windows上使用Python 2.7的tensorflow windows+ ...