一、背景

公司要制作一个仿美团菜单列表的功能,我们先看下美团的菜单功能。
截图如下:

美团菜单列表视频链接
我们看下做完demo的截图

demo的视频链接:
视频

二、实现的需求点

1、关于绘制列表啥的就不说明了,这个简单。
2、列表联动效果:
a、点击左侧的菜单列表,右侧列表自动滚动到指定位置:

onTap: () {if (optionsScrollState != KEEP_STATIC) {return;}setState(() {index = i; //记录选中的下标subIndex = -1;menuClickToScroll = true;double offset = optionsOffsets[i] > maxOpScrollableDistance? maxOpScrollableDistance: optionsOffsets[i];_optionsController.animateTo(offset,duration: Duration(milliseconds: 200), curve: Curves.ease);});

右侧列表如果不是保持静止的状态,走以下逻辑,optionsOffsets保存的是点击左侧菜单右侧的选项列表需要滑动距离的数组,该滑动距离如果大于选项列表的最大滑动距离,则滑动该选项列表的最大滑动距离。
设置menuClickToScroll为true,则判断选项列表的滑动状态

NotificationListener(onNotification: (notification) {switch (notification.runtimeType) {case ScrollStartNotification:optionsScrollState = menuClickToScroll? SCROLLING_CLICED_BY_MENU: NORMAL_SCROLLING;break;case ScrollUpdateNotification:break;case ScrollEndNotification:menuClickToScroll = false;optionsScrollState = KEEP_STATIC;break;case OverscrollNotification:break;}},child: ListView.builder(padding: EdgeInsets.only(top: 0),controller: _optionsController,itemCount: _datas.length,//列表项构造器itemBuilder: (BuildContext context, int index) {return getChip(index);},)

optionsOffsets再initState方法中已经赋值了,

double distance = 0;optionsOffsets.add(distance);for (int i = 1; i < _datas.length; i++) {distance += getOffset(getItemLines(i - 1));optionsOffsets.add(distance);}getOffset(int i) {return (selectItemHeight + itemTopPadding) * i + topTipHeight;}

b、比较麻烦一些的处理是滑动选项列表时,左侧的菜单列表的指示器的变化。

_optionsController.addListener(() {if (_optionsController.offset < 0 ||_optionsController.offset >= maxOpScrollableDistance) {return;}isScrollDown = _optionsController.offset > optionsOffset;optionsOffset = _optionsController.offset;if (optionsScrollState == NORMAL_SCROLLING) {int scrollIndex = getScrollingItemIndex(_optionsController.offset);if (index != scrollIndex) {setState(() {index = scrollIndex;subIndex = -1;});int pos = (menuOffset / menuItemHeight).floor();double offset = 0;if (isScrollDown &&(menuOffset + menuOffsets[scrollIndex]) > halfWidgetHeight) {offset =menuOffsets[checkRangeIn(pos + 1, 0, menuOffsets.length - 1)];_menuController.jumpTo(offset > maxMenuScrollableDistance? maxMenuScrollableDistance: offset < 0? 0: offset);} else if (!isScrollDown &&(menuOffsets[scrollIndex] - menuOffset) < halfWidgetHeight) {offset =menuOffsets[checkRangeIn(pos - 1, 0, menuOffsets.length - 1)];_menuController.jumpTo(offset > maxMenuScrollableDistance? maxMenuScrollableDistance: offset < 0? 0: offset);}}}});

这里是为了防止列表滑动超出可滑动距离,如苹果手机列表会有弹性效果,会出现异常。

if (_optionsController.offset < 0 ||_optionsController.offset >= maxOpScrollableDistance) {return;
}

其余的代码是为了计算出菜单列表在选项列表在滚动时,需要联动滚动的距离,这个距离无论是向上滑,还是向下滑动,只要超过了屏幕的一半距离,菜单列表都需要自动滚动一段距离offset,使得菜单选中的指示器保持在屏幕的中央位置,就像美团的效果一样,具体可以看上面的视频。

三、源码地址

地址

Flutter之仿美团菜单列表简单版相关推荐

  1. 嵌入式菜单LCD简单版

    嵌入式菜单需求 相信大家做嵌入式的东西的时候,会有许多的参数需要显示到显示屏幕上,那么这些参数肯定不是拿来看看这么简单,最好还可以用按键来调节大小参数. 任务要求 根据前面大家的需求,我们简单想想我们 ...

  2. SwipeLayout 仿qq会话列表简单侧滑【删除,修改】

    前言: 使用SwipeLayout的优点: 1.无论是在RecyclerView,ListView,还是LinearLayout等,只要是ViewGroup用该控件都能实现侧滑. 2.控件的手势滑动冲 ...

  3. uniapp仿美团左侧菜单栏

    uniapp仿美团左侧菜单栏 实现仿美团菜单页,效果图如下 主题内容 <template><view class="deviceList"><!-- ...

  4. Android 仿美团选择城市、微信通讯录、饿了么点餐列表的导航悬停分组索引列表

    SuspensionIndexBar 项目地址:mcxtzhang/SuspensionIndexBar 简介:快速实现分组悬停.右侧索引导航联动 列表. 如 美团选择城市界面,微信通讯录界面.饿了么 ...

  5. Android仿ios二级菜单侧滑,仿IOS的列表项滑动菜单——ListItemMenu

    一个简单的仿IOS的列表项滑动菜单(也不知道怎么描述比较好). 顺手做出来的小东西,就分享给大家了. 仿iOS列表项滑动菜单: 1.滑动出现菜单,越界阻尼效果: 2.删除列表项效果. GitHub地址 ...

  6. android 美团下拉菜单,Android仿美团分类下拉菜单实例代码

    本文实例为大家分享了Android仿美团下拉菜单的实现代码,分类进行选择,供大家参考,具体内容如下 效果图 操作平台 AS2.0 第三方框架:butterknife build.gradle depe ...

  7. 【uniapp前端组件】仿美团外卖商品列表

    仿美团外卖商品列表 简易实现美团外卖商品列表,没什么技术难点,简单来说就是两个scroll-view协作,并且两个scroll-view不会滑动冲突. 实际效果 仿美团外卖商品列表实际项目效果 简介 ...

  8. Android仿美团外卖点菜联动列表

    Android高仿美团外卖点菜联动列表效果 最近项目中有一个添加购物车的需求,需要做成美团外卖点菜联动ListView的效果,可能有的朋友觉得这很简单,不就是2个Listview点击事件联动处理机制吗 ...

  9. 仿美团下拉菜单 html,React Native仿美团下拉菜单的实例代码

    本文介绍了React Native仿美团下拉菜单的实例代码,最近也在学习React Native,顺便分享给大家 在很多产品中都会涉及到下拉菜单选择功能,用的最好的当属美团了,其效果如下: 要实现上面 ...

最新文章

  1. 《算法基础》——2.3 求幂运算
  2. C#面试题——附答案
  3. Java编程中程序员会遇到的一些感性烦恼,你有遇到吗?
  4. 写给对前途迷茫的朋友
  5. 一起学《Troubleshooting Oracle Performance》吧
  6. it资产管理系统php,开源IT资产管理软件(GIPI)
  7. 如何解决git冲突,出现更新失败向下的箭头?
  8. 关于单细胞批次矫正那些事(二) KBET 用于单细胞批次矫正结果的评估
  9. 嵌入式开发之simulation--- 双目移动dsp机器人
  10. 分组码--原理,码率,软硬判决,编码增益
  11. 计算机专业初试,2019初试-计算机专业基础综合-考试大纲
  12. python的就业方向有哪些城市_Python就业方向有哪些?人工智能就业薪资待遇高吗?...
  13. mysql comment_mysql中的comment用法
  14. 声学模型训练-嵌入式训练
  15. LSV软件不定时无法下载谷歌影像的原因
  16. 20120821-GetDC
  17. ABBYY FineReader Server 与杂乱无章的较量。我们的解决方案如何去除重复内容,让商业文档井井有条?
  18. UDP通信——使用python实现简单的UDP通信
  19. win10 安装sqlserver2008
  20. Frida hook零基础教程

热门文章

  1. 《缠中说禅108课》81:图例、更正及分型、走势类型的哲学本质
  2. 行业解密:为什么跨境电商行业都在做社交媒体营销?
  3. 苹果iMessage垃圾信息泛滥:运营商难涉及
  4. 玩转Hadoop集群DNS改造
  5. HI3521D 烧录128M nand flash文件系统
  6. 抛弃AVANT用世界之窗了
  7. 微信ipad协议/个人微信协议/个微协议
  8. 基于PCE的SDN演进方式
  9. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(补2)--水下slam仿真构想
  10. 【数据挖掘】NLP中文分词概述