成都网站建设设计

将想法与焦点和您一起共享

flutter自然滑动,flutter 侧滑

Flutter 121: 图解简易 Slider 滑动条

小菜在业务开发过程中会自定义 Slider 滑动条,而在自定义之前,小菜先简单了解一下 Flutter 自带的 Slider ;

创新互联-专业网站定制、快速模板网站建设、高性价比大兴网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式大兴网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖大兴地区。费用合理售后完善,10多年实体公司更值得信赖。

简单分析源码可得, Slider 是一个有状态的 StatefulWidget 组件,属性也很清晰易懂,其中滑动过程中对应的 value 值和 onChanged 回调是必须参数;

value 未滑动过程中对应的值,在 min 和 max 之间; onChanged 是在滑动过程中回调,当 onChanged 为 null 或 value 所在的 min 和 max 集合范围为空时, Slider 禁止滑动;

min 和 max 为滑动条范围,而 value 的取值范围是在 min 和 max 之间,无论 value 为正还是负,均需要在 min 和 max 之间;

activeColor 为滑动条已滑动过的颜色; inactiveColor 为滑动条中未滑动的颜色;两者均可以在 SliderTheme 中设置;

label 为滑动条滑动到某一节点的标签文案; divisions 是把 min 和 max 等分为 divisions 份数;只有在 divisions 生效时, label 才会展示;

onChangeStart 和 onChangeEnd 分别对应滑动过程中 value 值何时开始更改或何时完成更改时对应的回调;

Slider 的主题效果可以通过 SliderTheme 或 ThemeData.sliderTheme 中获取更新,相较于 Slider 只提供已滑动和未滑动颜色效果,属性粒度更细;

activeTrackColor 和 inactiveTrackColor 分别对应 Slider 已滑动过和未滑动过的轨道颜色;

thumbColor 对应滑动按钮颜色,而 overlayColor 对应滑动按钮映射的叠层颜色,通常设置为半透明状态; overlayShape 对应叠层样式;

valueIndicatorColor 对应 label 气泡颜色; valueIndicatorShape 对应气泡内文字属性; valueIndicatorShape 对应气泡样式,可以再此进行自定义气泡;

activeTickMarkColor 对应已选中刻度颜色; inactiveTickMarkColor 对应未选中刻度颜色; tickMarkShape 对应刻度样式;

trackHeight 为 Slider 轨道高度; trackShape 对应轨道样式,主要再此处进行自定义样式;

对于不可滑动状态, SliderThemeData 提供了对应属性;

Slider 案例源码

小菜本节暂未涉及自定义滑动条样式,对于底层的 Slider 了解还不够深入;如有错误,请多多指导!

Flutter CustomScrollView 自定义滑动效果

基本和AppBar一样,只是他只能在CustomScrollView中使用,应该很常见,滑动的时候固定appbar,就需要用到他.

大部分和appbar一样,主要说下重要的几个:

是否将导航栏部分固定在appbar的位置.这个需求在实际中很常用. 看看效果图.

当 pinned = false:

可以看到appbar并没有固定在最上面,而是根据内容划出了界面.

当 pinned = true :

这个应该是需求中经常用到的效果了.

当floating = false :

当floating = true:

仔细看 ,区别是在列表整体向下滑动时,appbar开始显示的位置不同.

当为false时 ,向下滑动时,会先降列表内容滑动顶部,然后appbar会跟着列表滑动显示出来.如上图

当为true时, 向下滑动时,appbar会先跟着列表滑动显示出来. 然后继续列表的滑动. 如上图

不能单独使用要配合 ****floating 和 ****pinned

具体效果看官网地址

是否展开,默认false,直接看值为true的效果图,就明白了.

可以再里面添加扩展的内容:

通过测试发现 **后面不是 FlexibleSpaceBar 的话, stretch = true 无效. **

和Padding一样.子控件是 sliver 类型...

上图中在padding中添加了一个背景色为青色的容器widget

里面可以设置不是 sliver 类型的widget。如上图中的 padding中添加的 container

就两个协议,一个是布局协议一个展示协议.基本和GridView一样.也有count和extext... 不设置个数默认无数个

SliverChildListDelegate 这种方式前提是知道cell个数,比较少,好搭建

SliverChildBuilderDelegate 这种方式,可以根据数组去创建,不知道cell个数

和listview差不多.也是协议 不设置个数默认无数个

Flutter 滑动、缩放控件

onInteractionEnd 交互结束

onInteractionStart 交互开始

onInteractionUpdate 滑动时候一直会回调

focalPoint 是相对于屏幕左上角的偏移量。

localFocalPoint是相对于父容器区域左上角的偏移量。

scale缩放量。

horizontalScale水平缩放量。

verticalScale竖直缩放量。

rotation旋转量。------ 这里说明能监听到旋转量

还可以通过transformationController进行变换控制,有兴趣的可以自己研究。

参考文章

Flutter了解之可滑动组件

Flutter官方并没有对Widget进行官方分类,对其分类主要是为了对Widget进行功能区分。

当组件内容超过当前显示窗口时,如果没有特殊处理,Flutter则会提示Overflow错误。为此,Flutter提供了多种可滚动组件用于显示列表和长布局。

在可滚动组件的坐标描述中,通常将滚动方向称为主轴,非滚动方向称为纵轴。由于可滚动组件的默认方向一般都是沿垂直方向,所以默认情况下主轴就是指垂直方向,水平方向同理。

通常可滚动组件的子组件可能会非常多、占用的总高度也会非常大;如果要一次性将子组件全部构建出将会非常昂贵!为此,Flutter中提出一个Sliver(中文为“薄片”的意思)概念,如果一个可滚动组件支持Sliver模型,那么该滚动可以将子组件分成好多个“薄片”(Sliver),只有当Sliver出现在视口中时才会去构建它,这种模型也称为“基于Sliver的延迟构建模型”。

可滚动组件中有很多都支持基于Sliver的延迟构建模型,如ListView、GridView,但是也有不支持该模型的,如SingleChildScrollView。

在很多布局系统中都有ViewPort的概念,在Flutter中,术语ViewPort(视口),如无特别说明,则是指一个Widget的实际显示区域。例如: 一个ListView的显示区域高度是800像素,虽然其列表项总高度可能远远超过800像素,但是其ViewPort仍然是800像素。

可滚动组件都直接或间接包含一个Scrollable组件

如果要给可滚动组件添加滚动条,只需将Scrollbar作为可滚动组件的任意一个父级组件。

沿一个方向线性排布所有子组件。支持基于Sliver的延迟构建模型。

ListView高度边界无法确定时会异常。

默认构造函数有一个children参数,它接受一个Widget列表。

实际上通过此方式创建的ListView和使用SingleChildScrollView+Column的方式没有本质的区别。

适合只有少量的子组件的情况,因为这种方式需要将所有children都提前创建好(这需要做大量工作),而不是等到子widget真正显示的时候再创建,也就是说通过默认构造函数构建的ListView没有应用基于Sliver的懒加载模型。

例(水平滚动)

适合列表项比较多(或者无限)的情况,因为只有当子组件真正显示的时候才会被创建,也就说通过该构造函数创建的ListView是支持基于Sliver的懒加载模型的。

例(不同类型的item)

ListView.separated可以在生成的列表项之间添加一个分割组件,它比ListView.builder多了一个separatorBuilder参数,该参数是一个分割组件生成器。

类似于Android中的ScrollView,它只能接收一个子组件。

通常内容不会超过屏幕太多时使用SingleChildScrollView,这是因为它不支持基于Sliver的延迟实例化模型,所以如果预计视口可能包含超出屏幕尺寸太多的内容时,那么使用SingleChildScrollView将会非常昂贵(性能差),此时应该使用一些支持Sliver延迟加载的可滚动组件,如ListView。

例(将大写字母A-Z沿垂直方向显示)

一个二维网格列表

GridView和ListView的大多数参数都是相同的。

横轴为固定数量子元素。

GridView.count构造函数内部使用了SliverGridDelegateWithFixedCrossAxisCount。

例(GridView.count)

该子类实现了一个横轴子元素为固定最大长度的layout算法

当子widget比较多时,可以通过GridView.builder来动态创建子widget。

GridView.builder 必须指定的参数有两个,其中itemBuilder为子widget构建器。

举个例子,假设有一个页面,顶部需要一个GridView,底部需要一个ListView,而要求整个页面的滑动效果是统一的,即它们看起来是一个整体。如果使用GridView+ListView来实现的话,就不能保证一致的滑动效果,因为它们的滚动效果是分离的。

所以这时就需要一个"胶水",把这些彼此独立的可滚动组件"粘"起来,而CustomScrollView的功能就相当于“胶水”。

Sliver有细片、薄片之意,在Flutter中Sliver通常指可滚动组件子元素。在CustomScrollView中,需要粘起来的可滚动组件就是CustomScrollView的Sliver了,如果直接将ListView、GridView作为CustomScrollView是不行的,因为它们本身是可滚动组件而并不是Sliver。

因此,为了能让可滚动组件能和CustomScrollView配合使用,Flutter提供了一些可滚动组件的Sliver版,如SliverList、SliverGrid等。

实际上Sliver版的可滚动组件和非Sliver版的可滚动组件最大的区别就是前者不包含滚动模型(自身不能再滚动),而后者包含滚动模型 ,也正因如此,CustomScrollView才可以将多个Sliver"粘"在一起,这些Sliver共用CustomScrollView的Scrollable,所以最终才实现了统一的滑动效果。

例(SliverList)

例(SliverGrid)

可以用ScrollController来控制可滚动组件的滚动位置

滚动位置恢复

ScrollPosition

ScrollController控制原理

滚动监听

Flutter:手把手教你使用滚动型列表组件:ListView

ListView的基础创建使用有三种方式:

通过默认构造函数来创建列表,应用场景 = 短列表

这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,使用不当可能引起性能问题甚至卡顿。

长列表

列表子项之间需要分割线

ListView的进阶使用主要包括:下拉刷新 上拉加载

在Flutter中,ListView结合RefreshIndicator组件实现下拉刷新

通过包裹一层RefreshIndicator,自定义onRefresh回调方法实现

方式有两种:

通过ListView.controller属性可以判断ListView是否滑动到了底部,再进行上拉加载

NotificationListener是一个Widget,可监听子Widget发出的Notification

ListView在滑动时中会发出ScrollNotification类型的通知,可通过监听该通知得到ListView的滑动状态,判断是否滑动到了底部,从而进行上拉加载

NotificationListener有一个onNotification属性,定义了监听的回调方法,通过它来处理加载更多逻辑

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。


网站栏目:flutter自然滑动,flutter 侧滑
标题来源:http://chengdu.cdxwcx.cn/article/hoijgp.html