首页 > 其他分享 >flutter 效果实现 —— 下拉滑动面板

flutter 效果实现 —— 下拉滑动面板

时间:2023-01-11 21:33:47浏览次数:38  
标签:ac return fling double dy child 滑动 面板 flutter

效果:

代码:

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  final double maxHeight = 200;
  final double minHeight = 50;

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin {
  late AnimationController _ac;

  final VelocityTracker _vt = VelocityTracker.withKind(PointerDeviceKind.touch);

  @override
  void initState() {
    super.initState();
    _ac = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 300),
    );
  }

  @override
  void dispose() {
    _ac.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Sliding Box"),
        bottom: PreferredSize(
          preferredSize: Size.fromHeight(75),
          child: Container(
            height: 75,
            alignment: Alignment.center,
            width: double.infinity,
            color: Colors.blueGrey,
            child: Text("Fixed header"),
          ),
        ),
      ),
      body: Column(
        children: [
          Listener(
            onPointerDown: (PointerDownEvent p) => _vt.addPosition(p.timeStamp, p.position),
            onPointerMove: (PointerMoveEvent p) {
              _vt.addPosition(p.timeStamp, p.position);
              _onGestureSlide(p.delta.dy);
            },
            onPointerUp: (PointerUpEvent p) => _onGestureEnd(_vt.getVelocity()),
            child: AnimatedBuilder(
              animation: _ac,
              builder: (BuildContext context, Widget? child) {
                return Container(height: 200 * _ac.value + 26, child: child!);
              },
              child: Stack(
                children: [
                  _panelBody(),
                  Positioned(
                    bottom: 0,
                    left: 0,
                    right: 0,
                    child: _buildSlideIndicator(),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }

  void _onGestureSlide(double dy) {
    //向下滚动 dy > 0; 向上滚动 dy < 0
    // print('slide: $dy');
    _ac.value += dy / (widget.maxHeight - widget.minHeight);
  }

  void _onGestureEnd(Velocity v) {
    print('onGestureEnd: ${v.pixelsPerSecond.dy}');

    //如果动画已经运行,则直接返回
    if (_ac.isAnimating) return;

    double visualVelocity = v.pixelsPerSecond.dy / (widget.maxHeight - widget.minHeight);
    print('pixelsPerSecond: ${v.pixelsPerSecond.dy}, visualVelocity: $visualVelocity');
    //若当前下拉速度超过阈值,则进行 fling
    if (v.pixelsPerSecond.dy.abs() >= 365) {
      //velocity 等于 -1 是关闭,1 是打开
      //fling,按一秒的时间计算滑过的距离
      _ac.fling(velocity: visualVelocity);
      return;
    }
    // 若当前下拉速度未超过阈值
    if (_ac.value >= 0.5) {
      _ac.fling(velocity: 1);
    } else {
      _ac.fling(velocity: -1);
    }
  }

  Widget _panelBody() {
    return Container(
      color: Colors.green,
    );
  }

  Widget _buildSlideIndicator() {
    return Container(
      padding: const EdgeInsets.symmetric(vertical: 10),
      color: Colors.red,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Container(
            width: 30,
            height: 5,
            decoration: BoxDecoration(
              color: Colors.grey[300],
              borderRadius: BorderRadius.all(Radius.circular(12.0)),
            ),
          ),
        ],
      ),
    );
  }
}

标签:ac,return,fling,double,dy,child,滑动,面板,flutter
From: https://www.cnblogs.com/lemos/p/17044951.html

相关文章

  • 【EasyUI篇】Slider滑动条组件
    微信公众号:​​程序yuan​​关注可获得更多资源。问题或建议,请公众号留言;​​查看-->全套EasyUI示例目录​​26.Slider滑动条组件      JSP文件<%--Createdb......
  • 【首页】顶栏滑动跟随
    一、【首页】顶栏滑动跟随1.1顶部滑动跟随需要在scroll-view中添加scroll-into-view属性,其中代表滚动到哪个块中,匹配为子元素的id,也就是子元素需要加入id值,但是id值不可......
  • Flutter异常监控 - 伍 | 关于异常监控框架设计的思考
    前言最近阅读Catcher、BugSnag、Rollbar三个Flutter异常监控开源框架,文章链接如下:Flutter异常监控-壹|从Zone说起Flutter异常监控-贰|框架Catcher原......
  • 滑动窗口【模板题】
    滑动窗口给定一个大小为\(n≤10^6\)的数组。有一个大小为\(k\)的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到\(k\)个数字。每次滑动窗口向右移动......
  • 菜鸟金融登录页面的滑动验证码,selenium写法
    #获取拖动按钮位置并拖动defslide_auth(self):try:time.sleep(random.randint(6,8))#checkhaveslideverifyelementsor......
  • flutter常用包简介
    flutter常用包简介url_launcher:链接到外部的浏览器dio:类似于对httpClient请求的封装ffi:有dart:ffi,也有package:ffi,两者不同,用来加载dll文件win32:封装了常用......
  • flutter 基础 —— 事件监听
    事件机制:命中测试的过程是从上层组件到下层组件,但是加入HitTestResult的顺序是从下到上,分发事件的顺序同加入顺序。通常,若用户点击坐标不在当前节点的size范围内,则......
  • 解决el-date-picker组件当日历面板展开时点击清空图标无法清空问题
    问题现象:支持选择多个时间的日期组件,在日历面板展开时点击清空图标是无法清空的  解决方案:查找资料发现可以通过change事件来监听清空操作,当监听到value值为null时......
  • Flutter异常监控 - 肆 | Rollbar源码赏析
    一.Rollbar可以帮你解决哪些问题无特别说明,文中Rollbar统指Rollbar-flutter1.代码复用Rollbar官方文档说是纯Dart实现,该特征意味着自带”代码复用”光环。如图当接......
  • android 原生打包到混合开发框架uniapp 和cordova (1) ----Android Studio中的Gradle面
    AndroidStudio中的Gradle面板没有Task任务列表 Tasklistnotbuiltduring sync 找不到gradle命令解决:1.找到gradle工具栏2.点击图中扳手->选中gradlesettin......