自定义水平刻度尺——RulerView

一、效果展示


二、核心思路

很多时候都无法直接使用flutter系统组件或第三方组件实现UI设计图,一般这种时候我们都会选择绘制自定义组件以达到效果。


三、实现方案

1、确认绘制需要的参数

1.value //初始刻度 

2.minValue  //尺子的最小刻度

3.maxValue  //尺子的最大刻度

4.step  //步数,即一个刻度的值

5.width  //尺子的宽度

6.height  //尺子的高度

7.subScaleCountPerScale  //每个大刻度的子刻度数

8.subScaleWidth  //单个刻度的宽度

9.scaleColor  //刻度颜色

10.scaleTextColor  //刻度文字颜色

11.scaleTextFontSize   //刻度文字的大小

12.paddingItemWidth  //左右空白间距宽度

13.Function(double) onSelectedChanged   //刻度尺选择结果回调

2、制定滑动方案

不论是刻度还是文字的绘制,都是相对容易的,重点是实现尺子的滑动效果。

因为两边留白(如图1、图2所示),所以考虑使用ListView来实现效果。使用ScrollController滑动控制器来初始化和更新刻度尺指示的位置。

图1
图2
​​​​​​

同时使用NotificationListener来监听刻度尺的滚动通知,用于实时更新滑动控制器和滑动结果的回调。 参考代码如下:

NotificationListener(
        onNotification: _onNotification,
        child: ListView.builder(
          physics: const ClampingScrollPhysics(),
          padding: const EdgeInsets.all(0),
          controller: _scrollController,
          scrollDirection: Axis.horizontal,
          itemCount: 3,
          itemBuilder: (BuildContext context, int index) {
            //两边的空白控件
            if (index == 0 || index == 2) {
              return SizedBox(
                // widget.paddingItemWidth是空白控件的宽度,这个是根据
                // 刻度尺的展示大小计算出来的,后面给到全部参考代码的时候会讲
                width: widget.paddingItemWidth,
                height: 0,
              );
            } else {
              //刻度尺
              return RealRulerView(
                subGridCount: widget.totalSubScaleCount,
                subScaleWidth: widget.subScaleWidth,
                step: widget.step,
                minValue: widget.minValue,
                height: widget.height,
                scaleColor: widget.scaleColor,
                scaleTextFontSize: widget.scaleTextFontSize,
                scaleTextColor: widget.scaleTextColor,
            
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HQL_seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值