返回顶部
首页 > 资讯 > 精选 >Flutter Flow如何实现滑动显隐层
  • 633
分享到

Flutter Flow如何实现滑动显隐层

2023-07-05 08:07:18 633人浏览 泡泡鱼
摘要

这篇文章主要讲解了“Flutter Flow如何实现滑动显隐层”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter Flow如何实现滑动显隐层”吧!实现思路思路其

这篇文章主要讲解了“Flutter Flow如何实现滑动显隐层”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter Flow如何实现滑动显隐层”吧!

实现思路

思路其实非常简单,监听横向滑动的手势事件,根据偏移量让上层组件进行偏移。当放手时,根据偏移量是否达到宽度的一半,使用动画进行移出或者关闭。

Flutter Flow如何实现滑动显隐层

偏移的实现方式有很多,但需要自由地进行布局和矩阵变换、透明度,并且需要支持动画的变化,Flow 组件是一个非常不错的选择。 Flow 组件可以通过代理类对子组件进行自定义布局,灵活性极强;如果是 CustomPaint绘制之王 可以绘制万物,那么 Flow 就是 布局之王,可以摆放万物。

另外,在滑动过程中需要注意限制偏移量,使偏移量在 0~size.width 之内;当放手时,通过动画控制器来驱动动画,使用补间让偏移量运动到 0 (打开) 或 size.width(关闭) 。当关闭时,在右下角展示一个按钮用于点击展开:

Flutter Flow如何实现滑动显隐层

布局的代码实现

Flow 组件布局最重要的是实现 FlowDelegate,在其中的 paintChildren 方法中实现布局的逻辑。和 CustomPainter 类似,FlowDelegate 的实现类也可以通过 super 构造为 repaint 入参设置可监听对象。可监听对象的变化会触发 paintChildren 重新绘制:

SwipeFlowDelegate 实现类再构造时传入可监听对象 offsetX,在绘制索引1 的孩子时,通过 Matrix4 进行偏移。这样只要在手势水平滑动中,更新 offsetX 值即可。另外,可以根据 offsetX.value 是否达到 size.width 知道是否是关闭状态,如果已经关闭,绘制按钮。

class SwipeFlowDelegate extends FlowDelegate {  final ValueListenable<double> offsetX;  SwipeFlowDelegate(this.offsetX) : super(repaint: offsetX);  @override  void paintChildren(FlowPaintinGContext context) {    Size size = context.size;    context.paintChild(0);    Matrix4 offsetM4 = Matrix4.translationValues(offsetX.value, 0, 0);    context.paintChild(1, transfORM: offsetM4);    // 偏移量对于父级尺寸    if (offsetX.value == size.width) {      Matrix4 m1 = Matrix4.translationValues(size.width / 2 - 30, size.height / 2 - 30, 0);      context.paintChild(2, transform: m1);      Matrix4 m2 = Matrix4.translationValues(size.width / 2 - 30, -(size.height / 2 - 50), 0);      context.paintChild(3, transform: m2);    }  }  @override  bool shouldRepaint(covariant SwipeFlowDelegate oldDelegate) {    return oldDelegate.offsetX.value != offsetX.value;  }}

从这里可以看出,FlowDelegate 的最大优势是可以自定义孩子的绘制与否,还可以在绘制时通过 Matrix4 对孩子进行矩阵变换,还有可选参数可以控制透明度。接下来使用 Flow 组件时,提供 SwipeFlowDelegate ,并在 children 列表中依次放入子组件。其中前两个组件由外界传入,分别是底组件和上层组件,这样组件的布局就完成了,接下来监听事件,更新 factor 即可:

final ValueNotifier<double> factor = ValueNotifier(0);Flow(  delegate: SwipeFlowDelegate(factor),  children: [    widget.content,    widget.overflow,    GestureDetector(        onTap: open,        child: const Icon(Icons.menu_open_outlined, color: Colors.white)),    GestureDetector(        onTap: () {          Navigator.of(context).pop();        },        child: const Icon(Icons.close, color: Colors.white))  ],)

手势的监听

这里手势的处理是非常简单的,通过 GestureDetector 监听水平拖拽事件。在 onHorizontalDragUpdate 中根据拖拽的偏移量更新 factor 的值,其中通过 .clamp(0, widget.width) 可以限制偏移量的取值区间。

@overrideWidget build(BuildContext context) {  return GestureDetector(      behavior: HitTestBehavior.opaque,      onHorizontalDragUpdate: _onHorizontalDragUpdate,      onHorizontalDragEnd: _onHorizontalDragEnd,      child: SizedBox(        height: MediaQuery.of(context).size.height,        width: widget.width,        child: Flow( delegate:// 同上,略...      );}void _onHorizontalDragUpdate(DragUpdateDetails details) {  double cur = factor.value + details.delta.dx;  factor.value = cur.clamp(0, widget.width);}void _onHorizontalDragEnd(DragEndDetails details) {  if (factor.value > widget.width / 2) {    close();  } else {    open();  }}

最后在 _onHorizontalDragEnd 回调中,根据当前偏移量是否大于一般宽度,决定关闭还是打开。期间过程使用动画进行偏移量的过渡变化。

动画的使用

动画的使用,主要是通过 AnimationController 动画控制器来驱动数值的变化;在放手时 Tween 创建补间动画器,监听动画器数值的变化更新偏移量。这样偏移量就可以在指定时间内,在两个值之间渐变,从而产生动画效果。比如抬手时,open 方法是让偏移量从当前位置变化到 0 :

class _ScrollHideWrapperState extends State<ScrollHideWrapper> with SingleTickerProviderStateMixin {  late AnimationController _ctrl;  final ValueNotifier<double> factor = ValueNotifier(0);  @override  void initState() {    super.initState();    _ctrl = AnimationController(      duration: const Duration(milliseconds: 200),      vsync: this,    );  }  @override  Widget build(BuildContext context) {    // 略同...  }  // 动画关闭  Future<void> close() async {    Animation<double> anim = Tween<double>(begin: factor.value, end: widget.width).animate(_ctrl);    anim.addListener(() => factor.value = anim.value);    await _ctrl.forward(from: 0);  }  // 动画打开  Future<void> open() async {    Animation<double> anim = Tween<double>(begin: factor.value, end: 0).animate(_ctrl);    anim.addListener(() => factor.value = anim.value);    await _ctrl.forward(from: 0);  }}

如果想让动画的变化非匀速,可以使用 Curve 来控制动画曲线。这样,基于 Flow 实现的自定义布局,就可以根据手势和动画,完成特定的交互功能。从这里可以看出 Flow 自定义布局的灵活性非常强,很多疑难杂症,都可以使用它来完成。

感谢各位的阅读,以上就是“Flutter Flow如何实现滑动显隐层”的内容了,经过本文的学习后,相信大家对Flutter Flow如何实现滑动显隐层这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Flutter Flow如何实现滑动显隐层

本文链接: https://lsjlt.com/news/350602.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Flutter Flow如何实现滑动显隐层
    这篇文章主要讲解了“Flutter Flow如何实现滑动显隐层”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter Flow如何实现滑动显隐层”吧!实现思路思路其...
    99+
    2023-07-05
  • Flutter Component动画的显和隐怎么实现
    这篇文章主要讲解了“Flutter Component动画的显和隐怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter Component动画的显和隐怎么...
    99+
    2023-07-05
  • Flutter 利用CustomScrollView实现滑动效果
    目录CustomScrollView 简介 改造原代码 让导航栏更有趣 改造后的代码 其他效果 总结 我们在之前的文章中//www.jb51.net/article/213709.h...
    99+
    2024-04-02
  • Flutter实现滑动块验证码功能
    Flutter实现滑动块验证码功能,供大家参考,具体内容如下 本文实现的是一个用于登录时,向右滑动滑动块到最右边完成验证的一个功能。当滑动未到最右边时,滑动块回弹回左边起始位置。 ...
    99+
    2024-04-02
  • 微信小程序如何实现卡片层叠滑动
    本篇内容主要讲解“微信小程序如何实现卡片层叠滑动”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序如何实现卡片层叠滑动”吧!实现效果:左右滑动时,向相应方向移动一个卡片位置;2.点击某一项...
    99+
    2023-06-30
  • vue实现右侧滑出层动画
    本文实例为大家分享了vue实现右侧滑出层动画的具体代码,供大家参考,具体内容如下 效果图: 代码: <!DOCTYPE html> <html> &l...
    99+
    2024-04-02
  • HTML如何实现网页盒子隐藏滑动效果
    这篇文章主要介绍了HTML如何实现网页盒子隐藏滑动效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HTML如何实现网页盒子隐藏滑动效果文章都会有所收获,下面我们一起来看看吧。...
    99+
    2024-04-02
  • 如何实现Flutter动画
    这篇文章主要为大家展示了“如何实现Flutter动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现Flutter动画”这篇文章吧。动画中的三大核心为了能够实现动画效果,必须提供下面的三个...
    99+
    2023-06-04
  • Flutter Animation实现缩放和滑动动画效果
    本文实例为大家分享了Flutter Animation实现缩放和滑动动画的具体代码,供大家参考,具体内容如下 Animation对象是Flutter动画库中的一个核心类,它生成指导动...
    99+
    2024-04-02
  • jquery如何显示已隐藏的div层
    这篇文章将为大家详细讲解有关jquery如何显示已隐藏的div层,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 jquery显示已隐藏div层...
    99+
    2024-04-02
  • 遮罩层+Iframe如何实现界面自动显示
    这篇文章给大家分享的是有关遮罩层+Iframe如何实现界面自动显示的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果在教师评阅作业时,先把学生的作业展现出来,然后关掉界面进行评分(用百度主页做演示)Iframei...
    99+
    2023-06-09
  • css3如何实现鼠标滑过隐现效果
    本篇内容主要讲解“css3如何实现鼠标滑过隐现效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css3如何实现鼠标滑过隐现效果”吧! ...
    99+
    2024-04-02
  • js如何实现做通讯录的索引滑动显示效果和滑动显示锚点效果
    小编给大家分享一下js如何实现做通讯录的索引滑动显示效果和滑动显示锚点效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一个是...
    99+
    2024-04-02
  • Flutter怎么实现滑动块验证码功能
    这篇文章主要介绍“Flutter怎么实现滑动块验证码功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter怎么实现滑动块验证码功能”文章能帮助大家解决问题。本文实现的是一个用于登录时,向右...
    99+
    2023-06-29
  • react如何实现显示隐藏div
    本文小编为大家详细介绍“react如何实现显示隐藏div”,内容详细,步骤清晰,细节处理妥当,希望这篇“react如何实现显示隐藏div”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。react实现显示隐藏div的...
    99+
    2023-07-05
  • 微信小程序如何实现横向滑动scroll-view隐藏滚动条
    这篇文章主要介绍微信小程序如何实现横向滑动scroll-view隐藏滚动条,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!wxml <scroll-view ...
    99+
    2024-04-02
  • android实现动态显隐进度条
    本文实例为大家分享了android实现动态显隐进度条的具体代码,供大家参考,具体内容如下 调用 ProgressUtil.startProgress(this, new Prog...
    99+
    2024-04-02
  • css3和jquery如何实现动画显示弹出层按钮
    这篇文章主要为大家展示了“css3和jquery如何实现动画显示弹出层按钮”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css3和jquery如何实现动画显示弹...
    99+
    2024-04-02
  • css如何实现元素显示与隐藏动画效果
    这篇文章主要讲解了“css如何实现元素显示与隐藏动画效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css如何实现元素显示与隐藏动画效果”吧! ...
    99+
    2024-04-02
  • js如何实现滑动穿透
    这篇文章将为大家详细讲解有关js如何实现滑动穿透,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。场景当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作