Flutter _ 你真的会用 Slider 组件吗?

body: Slider(
value: _value,
min: 0, // 滑动范围最小值
max: 100, // 滑动范围最大值
// 用了 divisions 滑动范围就是离散的,把 100 分成 10 个等长范围,
// 每次滑动的最小单元是下一个离散点,我喜欢叫做刻度,便于理解,比如这里是 10 个刻度
divisions: 10,
label: “$_value”, // 标签
activeColor: Colors.blue, // 激活部分的轨道颜色
inactiveColor: Colors.grey, // 未激活轨道部分的颜色
onChanged: (value){ // 滑动滑块时的回调函数
setState(() {
_value = value;
});
},
)

使用 SliderTheme,滑块主题

Slider 的使用难道就这么简单吗,答案显然不是。上面直接声明一个 Silder 并使用,只能算是生成了 Slider 的 4 个基本组成部分(轨道、滑块、标签、刻度)。如何对这些基本结构定制化呢?比如我想让轨道的大小、颜色、形状按照 UI 出图来决定,那么 SlideTheme 就上场了,在实际开发中,基本都是用 SlideTheme 来包装 Slider 使用。

简单点说,就是使用 SliderTheme 可以自定义 Slider 各个组件的颜色和形状,提供了更好的扩展性。

下面代码是 SliderTheme 的基本使用方法。

body: SliderTheme(
data: SliderTheme.of(context).copyWith(
trackHeight: 10, // 轨道高度
trackShape: RectangularSliderTrackShape(), // 轨道形状,可以自定义
activeTrackColor: Colors.blueGrey, // 激活的轨道颜色
inactiveTrackColor: Colors.black26, // 未激活的轨道颜色
thumbShape: RoundSliderThumbShape( // 滑块形状,可以自定义
enabledThumbRadius: 30 // 滑块大小
),
thumbColor: Colors.white, // 滑块颜色
overlayShape: RoundSliderOverlayShape( // 滑块外圈形状,可以自定义
overlayRadius: 50, // 滑块外圈大小
),
overlayColor: Colors.black54, // 滑块外圈颜色
valueIndicatorShape: PaddleSliderValueIndicatorShape(), // 标签形状,可以自定义
activeTickMarkColor: Colors.red, // 激活的刻度颜色
),
child: Slider(
value: _value,
min: 0,
max: 100,
divisions: 10,
label: ‘$_value’,
onChanged: (v){
setState(() {
_value = v;
});
},
),
),

呈现出来的效果是这样的。

SliderTheme

介绍 Slider 的使用方法绝对不是本文的目的。细心的读者可能会发现,在上图中,Slider 的轨道(track)宽度并没有占满水平方向,左右还留有空间。读者在直观上可能会认为是轨道自带了外边距(margin)或内边距(padding),其实都不是!左右留有的空间是 Slider 的大小,Slider 占据了整个屏幕的水平宽度。留出的左右空白大小,刚好是滑块外圈直径的大小!滑块滑到最左或最右,能保证滑块仍然在 Slider 内部,仅此而已,如下图。

SliderTheme

如何让轨道宽度和 Slider 一样?

读者用过某音,某狗的音乐播放器,某牙、某站的视频播放器,会发现一个共性:他们的滑块是不会超过轨道的。既然有了上面的问题,那么如何解决呢?以正常的角度来看问题,本质是轨道的宽度不够导致的,那么我们让轨道的宽度和 Slider 保持一致,问题就迎刃而解了。

Slider 各个组件(轨道、滑块、标签、刻度)的形状都是可以自定义的,Slider 轨道形状默认是圆角,即(RoundedRectSliderTrackShape),通过继承 RoundedRectSliderTrackShape 重写 getPreferredRect 方法,我们就能很容易的对轨道的宽度、高度做出调整。

class FullWidthTrackShape extends RoundedRectSliderTrackShape {
Rect getPreferredRect({
@required RenderBox parentBox,
Offset offset = Offset.zero,
@required SliderThemeData sliderTheme,
bool isEnabled = false,
bool isDiscrete = false,
}) {
final double trackHeight = sliderTheme.trackHeight;
final double trackLeft = offset.dx;
final double trackTop = offset.dy + (parentBox.size.height - trackHeight) / 2;
// 让轨道宽度等于 Slider 宽度
final double trackWidth = parentBox.size.width;
return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);
}
}

上面代码 FullWidthTrackShape 继承了 RoundedRectSliderTrackShape 并重写了 getPreferredRect 方法,让轨道的宽度和 Slider一样。代码写好了,那就试试将下面原先的代码

trackShape: RectangularSliderTrackShape(), // 轨道形状,可以自定义

改为我们刚刚自定义的 FullWidthTrackShape

trackShape: FullWidthTrackShape(), // 轨道形状,可以自定义

来看看效果怎么样,如下图,轨道的宽度和 Slider 一样了,是不是很开心。

SliderTheme

Slider,如何沿垂直方向滑动?

告别了上面一个小难题,我现在要讲讲如何让 Slider 沿垂直方向滑动。在你看过所有关于 Slider 组件使用的教程中,基本都是一个组件从左滑到右,滑到全文结束。本文希望从不一样的角度来讲解该如何让 Slider 沿垂直方向滑动。

方法其实很简单,利用 RotatedBox 旋转组件就行了,这个组件很简单,被它包裹的组件可以沿中心轴顺时针旋转,最小旋转角度是90°,即 1/4 圈。来看看下面的代码,顺时针旋转了 3/4 圈,Slider 就可以从下到上沿垂直方向滑动了。读者到这应该可以得到一个启发,在 flutter 中,各种组件的合理组合使用,可以实现意想不到的效果。

body: RotatedBox(
quarterTurns: 3, // 顺时针旋转 3/4 圈
child: SliderTheme(
data: SliderTheme.of(context).copyWith(
trackHeight: 10, // 轨道高度
trackShape: FullWidthTrackShape(), // 轨道形状,可以自定义

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618165277)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值