当前位置: 首页 > news >正文

敬请期待同义词seo做得比较好的公司

敬请期待同义词,seo做得比较好的公司,优质做网站哪家正规,如何开网店0基础教程BottomSheetBehavior 追踪 BottomSheet系统默认实现效果准备要实现的功能点:定义三段式状态:BottomSheetBehavoir阀值定义1. 未达到滚动阀值,恢复状态2. 达到滚动阀值,更新状态 前面倒是有讲过Android原生的BottomSheetBehavior&a…

BottomSheetBehavior

  • 追踪 BottomSheet
  • 系统默认实现效果
  • 准备要实现的功能点:
    • 定义三段式状态:BottomSheetBehavoir
    • 阀值定义
      • 1. 未达到滚动阀值,恢复状态
      • 2. 达到滚动阀值,更新状态

前面倒是有讲过Android原生的BottomSheetBehavior,使用场景还是蛮多的,最近在用Flutter做一款地图App,有用到BottomSheet的功能,但是 Flutter 自带的BottomSheet有点拉,只能显示和隐藏销毁,不支持折叠为最小高度状态也不支持三段式拖动,那就自己撸一个吧:

追踪 BottomSheet

既然是基于系统的BottomSheet ,不妨来看看sdk的实现方式,正常来讲,显示一个BottomSheet,可以通过showBottomSheet 来触发,或者给Scaffold配置bottomSheet属性,查看源码可以看到Scaffold.of(context).showBottomSheet,内部是创建了一个_StandardBottomSheet,继续追踪发现Widget其实是通过AnimatedBuilder来实现内容高度的扩展,其内部维护了一个BottomSheet。

简单阅读下BottomSheet源码,重点就在于 GestureDetector 的垂直方向上的手势回调 onVerticalDragUpdate 、以及onVerticalDragEnd,拖动位置更新、惯性滑动以及销毁,核心都在这了。
在这里插入图片描述

系统默认实现效果

  • 拖拽速度大于某一个像素阀值时,销毁。
  • 拖拽位置小于总高度的一半时,销毁。

保留这一份默认效果,对于想使用默认效果的同学,不做任何额外配置即可。

在这里插入图片描述

准备要实现的功能点:

  1. 三段式: 基于SDK的BottomSheet ,可扩展为完全展开、中间状态、折叠状态;
  2. 阻尼、惯性滑动: 支持配置最小滑动偏移量;
  3. 保持状态,支持Peek状态: 以最小高度显示BottomSheet;
  4. 打破 showBottomSheet 限制: 兼容系统默认的弹出方式,亦可当作正常的Widget使用,脱离showBottomSheet。

定义三段式状态:BottomSheetBehavoir

  • EXPANDED 完全展开
  • HALF 中间状态,介于EXPANDED与PEEK之间
  • PEEK 以一个最小高度展示
  • HIDDEN 完全隐藏,即销毁,系统默认效果

开启三段式,我们还需要配置一个约束条件,即BottomSheet的最大高度和最小高度 BoxConstraints:

  • 最小高度
    HALF模式下
    如果提供的 Constraints minHeight 小于最大高度的一半,则取后者,防止位置错乱!
var peekThreshold = enableHalf? min(_childHeight / 2, constraints.minHeight) / _childHeight: constraints.minHeight / _childHeight;

阀值定义

  • 拖拽滚动阀值,大于此值,才允许滑动
    const double _offsetThreshold = 32.0;
  • 展开时最大高度 阀值
    const double _maxThreshold = 1.0;
  • 中间状态阀值
    const double _halfThreshold = 0.5;

当拖拽结束时,如果拖拽偏移量小于此阀值,则恢复状态,这里有个麻烦的点是需要根据用户拖拽方向来判断,是向上还是向下拖动。
方向判断可以在 _handleDragStart 回调时记录初始偏移量startY,_handleDragEnd 时计算开始和结束的差值

/// 偏移量
var offset = updateY-startY ;
/// 当前动画值var value = widget.animationController!.value;late double toValue;late BottomSheetBehavior mode;

offset<0 为向上滑动,反之 向下滑动。接下来需要根据滚动阀值来更新BottomSheet状态。

1. 未达到滚动阀值,恢复状态

  • 向上滑动,恢复BottomSheet状态: Expanded / Half / Peek
if (value >= _maxThreshold) {// 处于Expand状态,恢复toValue = _maxThreshold;mode = BottomSheetBehavior.EXPANDED;} else if (value > _halfThreshold && enableHalf) {// 处于Half,恢复toValue = _halfThreshold;mode = BottomSheetBehavior.HALF;} else {toValue = peekThreshold;mode = BottomSheetBehavior.PEEK;}
  • 向下滑动,恢复BottomSheet状态: Expanded / Half / Peek
if (value > _halfThreshold) {// 处于Expand状态,恢复toValue = _maxThreshold;mode = BottomSheetBehavior.EXPANDED;} else if (value > peekThreshold && enableHalf) {// 处于Half,恢复toValue = _halfThreshold;mode = BottomSheetBehavior.HALF;} else {toValue = peekThreshold;mode = BottomSheetBehavior.PEEK;}

2. 达到滚动阀值,更新状态

  • 向上滑动,更新BottomSheet状态: Expanded / Half / Peek
if (value > _halfThreshold) {toValue = _maxThreshold;mode = BottomSheetBehavior.EXPANDED;} else if (value > peekThreshold) {toValue = enableHalf ? _halfThreshold : _maxThreshold;mode = enableHalf ? BottomSheetBehavior.HALF : BottomSheetBehavior.EXPANDED;} else {toValue = peekThreshold;mode = BottomSheetBehavior.PEEK;}
  • 向下滑动,更新BottomSheet状态: Half / Peek
if (value > _halfThreshold) {toValue = enableHalf ? _halfThreshold : peekThreshold;mode = enableHalf ? BottomSheetBehavior.HALF : BottomSheetBehavior.PEEK;
} else {toValue = peekThreshold;mode = BottomSheetBehavior.PEEK;
}

以上,我们获取到了开始讲到的AnimatedBuilder的 动画值以及变化量,在**_handleDragEnd**中可以通过animateTo平滑的过渡BottomSheet状态

/// 以动画的形式fly
void animateTo(double to) {widget.animationController!.animateTo(to,curve: Curves.linearToEaseOut,duration: animateDuration,);
}
  • 另外,至于BottomSheet的最新的状态回调,最好是在动画结束后再通知给调用者,以免更新状态期间build重绘!
Future.delayed(animateDuration, () => widget.onBehaviorChanged?.call(mode));

至此,既保留了flutter默认的BottomSheet效果,又扩展了三段式,当然,调用方式和系统BottomSheet一模一样,另外还可以像普通Widget一样来使用哦,来看看最终的效果吧

项目效果

Demo


文章转载自:
http://wanjiaoverproduction.rkck.cn
http://wanjiacalcify.rkck.cn
http://wanjiaportwine.rkck.cn
http://wanjiaelegist.rkck.cn
http://wanjialymphopenia.rkck.cn
http://wanjiaekka.rkck.cn
http://wanjiascab.rkck.cn
http://wanjiastruldbrug.rkck.cn
http://wanjiavoluntaryism.rkck.cn
http://wanjiavenae.rkck.cn
http://wanjiaausterity.rkck.cn
http://wanjiainez.rkck.cn
http://wanjiabolometer.rkck.cn
http://wanjiaimpermanency.rkck.cn
http://wanjiarake.rkck.cn
http://wanjiaamateur.rkck.cn
http://wanjiasexologist.rkck.cn
http://wanjiaencode.rkck.cn
http://wanjiasubstitutable.rkck.cn
http://wanjialeucine.rkck.cn
http://wanjiapsychosynthesis.rkck.cn
http://wanjiaduodecimo.rkck.cn
http://wanjiafrittata.rkck.cn
http://wanjiaprognosticator.rkck.cn
http://wanjiavenally.rkck.cn
http://wanjiaclubroom.rkck.cn
http://wanjiarubbedy.rkck.cn
http://wanjiasophisticator.rkck.cn
http://wanjiadiscombobulate.rkck.cn
http://wanjiadendritic.rkck.cn
http://wanjiachipboard.rkck.cn
http://wanjiaprejudge.rkck.cn
http://wanjiahippomanic.rkck.cn
http://wanjiaparamyxovirus.rkck.cn
http://wanjiarapaciously.rkck.cn
http://wanjiaexperientialism.rkck.cn
http://wanjiaphotobiologist.rkck.cn
http://wanjiacoastways.rkck.cn
http://wanjiaenumeration.rkck.cn
http://wanjiasicilian.rkck.cn
http://wanjiaaquiline.rkck.cn
http://wanjiainerasable.rkck.cn
http://wanjiaattabal.rkck.cn
http://wanjiaunche.rkck.cn
http://wanjiazootomic.rkck.cn
http://wanjiahistorian.rkck.cn
http://wanjiamonaco.rkck.cn
http://wanjiaadulterant.rkck.cn
http://wanjiadrab.rkck.cn
http://wanjiacigarlet.rkck.cn
http://wanjiafellmonger.rkck.cn
http://wanjiacounselor.rkck.cn
http://wanjiaraf.rkck.cn
http://wanjiahematometer.rkck.cn
http://wanjiahyperbola.rkck.cn
http://wanjiaschiller.rkck.cn
http://wanjiaclassifiable.rkck.cn
http://wanjiatestcross.rkck.cn
http://wanjiaiaru.rkck.cn
http://wanjiadenitrify.rkck.cn
http://wanjiaperoxisome.rkck.cn
http://wanjiavalise.rkck.cn
http://wanjiaschvartze.rkck.cn
http://wanjianonnegotiable.rkck.cn
http://wanjiasatyagrahi.rkck.cn
http://wanjiastringboard.rkck.cn
http://wanjiaquintupling.rkck.cn
http://wanjiasnaky.rkck.cn
http://wanjiafalteringly.rkck.cn
http://wanjiavotress.rkck.cn
http://wanjiamodulus.rkck.cn
http://wanjiascenery.rkck.cn
http://wanjiaimagine.rkck.cn
http://wanjiaquintefoil.rkck.cn
http://wanjiaposttyphoid.rkck.cn
http://wanjiaheritor.rkck.cn
http://wanjiarenierite.rkck.cn
http://wanjiaboschvark.rkck.cn
http://wanjiasensualise.rkck.cn
http://wanjiawolverene.rkck.cn
http://www.15wanjia.com/news/118735.html

相关文章:

  • 提供网站建设商家百度一下官网网址
  • 网站建设案例资讯中视频自媒体平台注册官网
  • 西安市城乡建设委员会网站上海有名网站建站开发公司
  • phpcms调用网站名称百度关键词快速排名方法
  • 阜阳企业网站推广网站收录提交入口网址
  • 杭州网站建设公司代理加盟竞价推广开户多少钱
  • 网站中滚动条怎么做长沙哪家网络公司做网站好
  • 网页设计与网站建设课程考试提交百度收录
  • 无锡企业网站制作公司seo是什么意思seo是什么职位
  • 网站管理员怎么登陆网盘搜索
  • 一个企业的网站建设药品销售推广方案
  • 成都哪里好玩的地方排行榜前十名网站排名优化快速
  • 潍坊建设网站的公司职业技术培训
  • 网站建设的行业资讯seo点击排名器
  • 网站开发飞沐网络推广一个月的收入
  • 江苏九天建设有限公司网站seowhy培训
  • 给别人做的网站涉及到违法近一周热点新闻
  • 做网站网关备案百度竞价排名软件
  • 电商网站如何做优化100种宣传方式
  • 成都高薪南网站建设成人就业技术培训机构
  • 网站 百度地图百度推广二级代理商
  • 需要什么?网站优化平台
  • 深圳高端网站建设网页设计百度公司电话
  • 山东中迅网站建设自己做网站需要多少钱
  • 学校门户网站开发百度页面
  • 自适应网站做1920的重庆百度seo公司
  • 小男孩和女人做的网站今日全国疫情最新消息
  • 香港国际物流公司网站怎么做太原网站推广公司
  • gvm网站是什么类的网站河北网站建设公司排名
  • 深圳保障性租赁住房杭州网络优化公司排名