源码地址:https://github.com/NeverOvO/flutter_drag
全端可用
核心代码:
变量部分
double _drageWidgetHeight = (window.physicalSize.height * 0.15) > 120.0 ? window.physicalSize.height * 0.15 : 120.0;
double _drageWidgetHeightTemp = (window.physicalSize.height * 0.15) > 120.0 ? window.physicalSize.height * 0.15 : 120.0;//temp
bool _drageWidgetShow = true;
_drageWidgetHeight 为 拖动时需要改变高度的组件的 实际的高度, _drageWidgetHeightTemp 为 拖动时高度的临时量, 初始值为120, bool _drageWidgetShow = true; 为组件是否隐藏
核心部分
Widget _dragWidgetHead(){ return GestureDetector( child: Container( child: Row( children: [ Expanded( child: Text("拖动此处"), ), IconButton( icon: Icon(_drageWidgetShow ? Icons.keyboard_arrow_down_rounded : Icons.keyboard_arrow_up_rounded), onPressed: (){ setState(() { _drageWidgetShow = !_drageWidgetShow; }); }, ), ], ), color: Colors.deepPurpleAccent, alignment: Alignment.center, ), behavior: HitTestBehavior.opaque, onVerticalDragDown: (s){ _drageWidgetHeightTemp = _drageWidgetHeight; }, onVerticalDragUpdate: (s){ if(_drageWidgetShow){ //屏蔽在组件隐藏时的拖动动作 setState(() { double hi = _drageWidgetHeightTemp - (s.localPosition.dy - 10); if(hi < 120){ _drageWidgetHeight = 120; }else if (hi > (MediaQuery.of(context).size.height / 1.5)){ _drageWidgetHeight = MediaQuery.of(context).size.height / 1.5; }else{ _drageWidgetHeight = _drageWidgetHeightTemp - (s.localPosition.dy - 10); } }); } }, onVerticalDragEnd: (s){ setState(() { _drageWidgetHeightTemp = _drageWidgetHeight; }); }, ); //头部选择 }
实际拖动组件,可以在里面任何东西,例如菜单,标题,分割线,或者是被拖动的组件,例子中为高度的改变
onVerticalDragDown:记录下当拖动开始时组件的高度,赋值给_drageWidgetHeightTemp;
onVerticalDragUpdate:
因为实时变动高度,所以高度的赋值需要在Update中进行
这里的hi值,用来记录组件在拖动过程时的高度变化,若小于自定义最低高度,则不再进行更新,
hi > (MediaQuery.of(context).size.height / 1.5) 则是对最高高度的显示,可以根据实际需要动态调整
(s.localPosition.dy - 10) :这里是为了避免在鼠标按下去刚开始拖动时出现的闪动情况,个人感觉取值10-20较为合适
onVerticalDragEnd :拖动结束后将目前高度赋值给赋值给_drageWidgetHeightTemp,可以不写
Comments NOTHING