【Flutter&Dart】 拖动边界线改变列宽并且有边界高亮和鼠标效果(12 /100)

【Flutter&Dart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100)
【Flutter&Dart】 拖动边界线改变列宽类似 vscode 那种拖动改变编辑框窗口大小(11 /100)

上效果

对比一下vscode的效果:

基本达到交互效果了,就是丝滑度好像差一点点。这个有可能是相关参数没有调试好。后期看看能否改进改进

上代码

dart 复制代码
import 'dart:async';

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

const String tag = 'MyDraggableViewDemo2';

class MyDraggableViewDemo2 extends StatelessWidget {
  const MyDraggableViewDemo2({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MyDraggableViewDemo2'),
        ),
        body: DraggableDemo(),
      ),
    );
  }
}

class DraggableDemo extends StatefulWidget {
  const DraggableDemo({super.key});

  @override
  State<StatefulWidget> createState() {
    return _DraggableDemoState();
  }
}

class _DraggableDemoState extends State<DraggableDemo> {
  double leftWidth = 100.0;
  double height = 200.0;
  bool isResizing = false;
  Timer? _timer;
  bool _isHovered = false;
  void _startTimer() {
    Logger(tag).info('_startTimer called!');
    _timer?.cancel();
    _timer = Timer(const Duration(seconds: 1), () {
      setState(() {
        _isHovered = true;
        Logger(tag).info('Mouse hovered for 2 second!');
      });
    });
  }

  void _cancelTimer() {
    Logger(tag).info('_cancelTimer called!');
    if (isResizing) {
      return;
    }
    _timer?.cancel();
    setState(() {
      _isHovered = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Row(children: [
      // 使用 SizedBox 组件来指定左边的组件的宽度
      SizedBox(
        width: leftWidth,
        child: Container(
          color: Colors.blue,
          child: Center(child: Text('左侧菜单')),
        ),
      ),
      // 检测鼠标进入和离开事件
      MouseRegion(
        cursor: SystemMouseCursors.resizeLeftRight, // 设置鼠标形状为剪头
        onEnter: (event) {
          Logger(tag).info('onEnter called!');
          _startTimer();
        },
        onExit: (event) {
          Logger(tag).info('onExit called!');
          _cancelTimer();
        },
        child: // 使用 GestureDetector 组件来包裹分割线
            GestureDetector(
          onHorizontalDragStart: (details) => {
            setState(() {
              isResizing = true;
            })
          },
          // 监听水平方向的拖拽操作
          onHorizontalDragUpdate: (details) {
            // 获取拖拽的距离
            double delta = details.delta.dx;
            // 更新左边的组件的宽度
            leftWidth += delta;
            // 限制左边的组件的宽度在 0 到屏幕宽度之间
            leftWidth = leftWidth.clamp(0.0, MediaQuery.of(context).size.width);
            // 重绘组件
            setState(() {});
          },
          onHorizontalDragCancel: () => {
            setState(() {
              isResizing = false;
            })
          },
          onHorizontalDragEnd: (details) => {
            Logger(tag).info('onHorizontalDragEnd called!'),
            setState(() {
              isResizing = false;
            })
          },
          child: VerticalDivider(
            width: _isHovered ? 3 : 2,
            thickness: _isHovered ? 3 : 2,
            color: Colors.grey[_isHovered ? 100 : 700],
          ),
        ),
      ),
// 使用 Expanded 组件来包裹右边的组件
      Expanded(
        child: Container(
          color: Colors.red,
          child: Center(child: Text('右侧工作区')),
        ),
      ),
    ]);
  }
}

效果已经完成,也没啥好说的了,晚安

=========END

相关推荐
simplepeng2 小时前
Room 3.0 KMP Alpha-01
android·kotlin·android jetpack
Lei活在当下3 小时前
Windows 下 Codex 高效工作流最佳实践
android·openai·ai编程
fatiaozhang95273 小时前
基于slimBOXtv 9.19.0 v4(通刷晶晨S905L3A/L3AB芯片)ATV-安卓9-完美版线刷固件包
android·电视盒子·刷机固件·机顶盒刷机·晶晨s905l3ab·晶晨s905l3a
私房菜4 小时前
Selinux 及在Android 的使用详解
android·selinux·sepolicy
一只特立独行的Yang4 小时前
Android中的系统级共享库
android
两个人的幸福online5 小时前
php开发者 需要 协程吗
android·开发语言·php
始持5 小时前
第二讲 Flutter 文字、图片与图标(基础视觉元素)
flutter
春日见6 小时前
端到端大模型自动驾驶
java·开发语言·驱动开发·docker·自动驾驶·计算机外设
修炼者6 小时前
WindowManager(WMS)构建全局悬浮窗
android
xiaoshiquan12067 小时前
Android Studio里,SDK Manager显示不全问题
android·ide·android studio