flutter 可在规定范围内拖拽且吸边组件

本文介绍如何创建一个Flutter组件,该组件允许在父级组件限定区域内进行拖动,并在边界处自动吸附。通过onPanUpdate手势监听实时更新拖动位置,目前支持左上和右上角的吸附,可进一步扩展到其他角落。

现有的拖拽组件基本上都是在整个屏幕范围内拖拽,本文为拖拽组件仅可在父级组件范围内拖拽

实现核心:使用onPanUpdate手势实时更新拖动位置

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

class AppFloatBox extends StatefulWidget {
    double fatherWidth; //父级组件宽度
    double fatherHeight; //父级组件高度
    Widget moveWidget; //可拖动的Widget
    double moveWidgetWidth; //可拖动的Widget宽度
    double moveWidgetHeight; //可拖动的Widget高度
    double offsetX; //初始化X轴
    double offsetY; //初始化Y轴
    Function complete; //可拖动的widgte点击事件
    AppFloatBox({
        @required this.fatherWidth,
        @required this.fatherHeight,
        @required this.moveWidget,
        @required this.moveWidgetWidth,
        @required this.moveWidgetHeight,
        @required this.offsetX,
        @required this.offsetY,
        this.complete
    });

    @override
    _AppFloatBoxState createState() => _AppFloatBoxState(fatherWidth, fatherHeight, moveWidget, moveWidgetWidth, moveWidgetHeight, offsetX, offsetY, complete);
}

class _
Flutter 提供了一个名为 `Draggable` 的内置组件,它可以方便地实现界面元素的拖拽功能,包括进度条。`Slider` 是 Flutter 中自带的一个用于表示数值范围并支持用户交互调整的控件,但它本身并不直接支持拖拽效果。如果你想要创建一个可拖动的进度条,你可以结合使用 `Draggable` 和 `Slider`,或者自定义一个类似控件。 以下是一个简单的例子,展示如何使用 `Draggable` 组件创建一个可拖动的进度条: ```dart import 'package:flutter/material.dart'; class DraggableProgress extends StatefulWidget { @override _DraggableProgressState createState() => _DraggableProgressState(); } class _DraggableProgressState extends State<DraggableProgress> { double _progress = 0.5; // 初始进度值 void _updateProgress(double value) { setState(() { _progress = value; }); } @override Widget build(BuildContext context) { return GestureDetector( onPanUpdate: (DragUpdateDetails details) { final velocity = details.velocity.dx; if (velocity.isFinite) { _updateProgress(_progress + velocity); } }, child: Draggable( child: Slider( value: _progress, min: 0.0, max: 1.0, divisions: 10, // 如果你想让进度条更精细,可以增加divisions onChanged: _updateProgress, ), feedback: Container(color: Colors.grey.withOpacity(0.2)), // 需要时显示拖动反馈 childWhenDragging: Container(), // 拖动时隐藏原滑块 ), ); } } ``` 在这个例子中,用户可以通过拖动 `Slider` 来改变 `_progress` 的值,从而模拟一个可拖拽的进度条效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值