Flutter Slider自定义滑块样式 Slider的label标签框常显示

1、自定义Slider滑块样式

Flutter Slider控件的滑块系统样式是一个圆点,thumbShape默认样式是RoundSliderThumbShape,如果想要使用其它的样式就需要自定义一下thumbShape;

例如需要一个上图样式的(圆点+半透明圆形边框)的滑块:


class CustomSliderThumbShape extends SliderComponentShape {

  final Size size = const Size(40, 40);

  @override
  Size getPreferredSize(bool isEnabled, bool isDiscrete) {
    return size;
  }

  @override
  void paint(PaintingContext context, Offset center, {required Animation<double> activationAnimation, required Animation<double> enableAnimation, required bool isDiscrete, required TextPainter labelPainter, required RenderBox parentBox, required SliderThemeData sliderTheme, required TextDirection textDirection, required double value, required double textScaleFactor, required Size sizeWithOverflow}) {

    final Canvas canvas = context.canvas;
    final Paint paint =  Paint();
    paint.color = const Color(0XFFEF5133);
    paint.isAntiAlias = true;

    final Paint paint2 =  Paint();
    paint2.color = const Color(0x30EF5133);
    paint2.isAntiAlias = true;
    //绘制滑块
    canvas.drawCircle(center, 5, paint);
    canvas.drawCircle(center, 14, paint2);
  }
}

然后再使用 SliderThemeData控件的 thumbShape属性设置一下就行了;

          SliderTheme(
            data: SliderThemeData(
              thumbShape: CustomSliderThumbShape(),
            ),
            child: Slider(
            ),
          ),

2、Slider的label标签框常显示

上图,Slider的label标签只有按住滑动块时才会显示,松开手指后label标签就会消失,设置 showValueIndicator: ShowValueIndicator.always,也不能一直显示;

若要Slider的label标签框常显示,可以把label标签框和滑块写在一起,使用SliderComponentShape自定义一下布局;

class IndicatorSliderThumbShape extends SliderComponentShape {

  IndicatorSliderThumbShape(this.msg);

  String msg;

  @override
  Size getPreferredSize(bool isEnabled, bool isDiscrete) {
    return const Size(15, 40);
  }

  TextPainter labelTextPainter = TextPainter()
    ..textDirection = TextDirection.ltr;

  @override
  void paint(PaintingContext context, Offset center, {required Animation<double> activationAnimation, required Animation<double> enableAnimation, required bool isDiscrete, required TextPainter labelPainter, required RenderBox parentBox, required SliderThemeData sliderTheme, required TextDirection textDirection, required double value, required double textScaleFactor, required Size sizeWithOverflow}) {

    final Canvas canvas = context.canvas;
    final Paint paint =  Paint();
    paint.color = const Color(0XFFEF5133);
    paint.isAntiAlias = true;
    //绘制圆点滑块
    canvas.drawCircle(center, 4, paint);

    final Paint paint2 =  Paint();
    paint2.color = const Color(0X30EF5133);
    paint2.isAntiAlias = true;
    //绘制半透明滑块
    canvas.drawCircle(center, 12, paint2);

    //在thumb上面添加一个自定义labels



    //绘制labels的圆角矩形
    final Paint paint3 =  Paint();
    paint3.color = const Color(0xFF2C28E8);
    paint3.isAntiAlias = true;
    var rr =  RRect.fromLTRBXY(center.dx+30, center.dy-20, center.dx-30, center.dy-50 , 8,8);
    canvas.drawRRect(rr, paint3);

    //绘制labels的三角形指示块
    final Paint paint4 =  Paint();
    paint4.color = const Color(0xFF28CD41);
    paint4.isAntiAlias = true;
    final path = Path();
    path.moveTo(center.dx, center.dy-10,);
    path.lineTo(center.dx-10, center.dy-20);
    path.lineTo(center.dx+10, center.dy-20,);
    path.close();

    canvas.drawPath(path, paint4);

    //绘制labels的文字内容
    labelTextPainter.text = TextSpan(
        text: msg,
        style: const TextStyle(fontSize: 14, color: Colors.white));
    labelTextPainter.layout();
    labelTextPainter.paint(
        canvas,
        center.translate(-labelTextPainter.width / 2, -43));

  }
}

label框的文字、指示器箭头、圆角背景框都可以自定义;

同样shape设置一下就可以了:

      SliderTheme(
            data: SliderThemeData(
              thumbShape: IndicatorSliderThumbShape('xx-km'),
            ),
            child: Slider(
            ),
          ),

下面是Slider的全部代码:

class TestSliderPage extends StatefulWidget {
  const TestSliderPage({Key? key}) : super(key: key);

  @override
  State<TestSliderPage> createState() => _TestSliderPageState();
}

class _TestSliderPageState extends State<TestSliderPage> {
  double _sliderValue = 0;
  final List<int> _slideValues = [1,3,5,10,20,30,40,50,60,70,80,90,100];
  @override
  Widget build(BuildContext context) {
    return BaseTopView(title: "Slider",
      body:
        Container(
          color: color_fff,
          child: SliderTheme(
            data: SliderThemeData(
              thumbShape: IndicatorSliderThumbShape('${_slideValues[_sliderValue.toInt()]}km'),
              trackHeight: ScreenUtils.getDip(1.5),
              thumbColor: color_EF5133,
              //滑块颜色
              activeTrackColor: color_EF5133,
              //已选中颜色
              inactiveTrackColor: color_EF5133.withAlpha(15),
              //未选中颜色
              activeTickMarkColor: Colors.transparent,
              //指示器点颜色
              inactiveTickMarkColor: Colors.transparent,
              //指示器点颜色
              valueIndicatorColor: color_EF5133,
              //气泡颜色
              overlayColor: color_EF5133.withAlpha(15),
              showValueIndicator: ShowValueIndicator.never,
              valueIndicatorTextStyle: TextStyle(fontSize: 11),
            ),
            child: Slider(
              value: _sliderValue,
              min: 0,
              max: 12,
              onChanged: (newValue) {
                setState(() {
                  _sliderValue = newValue;
                });
              },
              label: '${_slideValues[_sliderValue.toInt()]}km',
              divisions: _slideValues.length - 1,
            ),
          ),
      ),);
  }
}

随手记录、、、

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/406698.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

freeswitch 权威指南 --- 高级篇

官网文档&#xff1a;https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/ 关于 freeswitch 的公开教程&#xff1a;https://zhuanlan.zhihu.com/p/451981734 内容来自 《FreeSWITCH 权威指南》&#xff1a;目录&#xff1a;https://juejin.cn/post/702058079…

2024全国水科技大会暨流域水环境治理与水生态修复论坛(六)

论坛召集人 冯慧娟 中国环境科学研究院流域中心研究员 刘 春 河北科技大学环境与工程学院院长、教授 一、会议背景 为深入贯彻“山水林田湖是一个生命共同体”的重要指示精神&#xff0c;大力实施生态优先绿色发展战略&#xff0c;积极践行人、水、自然和谐共生理念&…

软件游戏报错d3dcompiler_43.dll缺失,提供多个方法修复d3dcompiler_43.dll

当电脑系统缺失 d3dcompiler_43.dll 文件时&#xff0c;尝试打开依赖于该文件的软件时&#xff0c;通常会遇到以下几种情况&#xff1a; 启动失败&#xff1a; 软件在启动过程中可能会立即停止响应或弹出错误消息&#xff0c;指出“找不到 d3dcompiler_43.dll”、“无法启动此…

LabVIEW开发FPGA的高速并行视觉检测系统

LabVIEW开发FPGA的高速并行视觉检测系统 随着智能制造的发展&#xff0c;视觉检测在生产线中扮演着越来越重要的角色&#xff0c;尤其是在质量控制方面。传统的基于PLC的视觉检测系统受限于处理速度和准确性&#xff0c;难以满足当前生产需求的高速和高精度要求。为此&#xf…

Windows 远程控制 Mac 电脑怎么操作

要从 Windows 远程控制 Mac 电脑&#xff0c;您可以使用内置 macOS 功能或第三方软件解决方案。以下是一些方法&#xff1a; 一、使用内置 macOS 功能&#xff08;屏幕共享&#xff09; 1、在 macOS 上启用屏幕共享 转至系统偏好设置 > 共享&#xff1b;选中“屏幕共享”…

2024-02-20(DataX,Spark)

1.Oracle利用DataX工具导出数据到Mysql。Oracle利用DataX工具导出数据到HDFS。 只是根据导入导出的目的地不同&#xff0c;DataX的Json文件书写内容有所不同。万变不离其宗。 书写的Json格式的导入导出规则文件存放再Job目录下的。 2.Spark概念 Apache Spark是用于大规模数…

使用向量数据库pinecone构建应用06:日志系统异常检测 Anomaly Detection

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

【算法与数据结构】1971、LeetCode寻找图中是否存在路径

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题应用并查集的理论直接就可以解决&#xff1a;【算法与数据结构】回溯算法、贪心算法、动态规划、图…

Golin 弱口令/漏洞/扫描/等保/基线核查的快速安全检查小工具

下载地址&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/db6afba6de1f 主要功能 主机存活探测、漏洞扫描、子域名扫描、端口扫描、各类服务数据库爆破、poc扫描、xss扫描、webtitle探测、web指纹识别、web敏感信息泄露、web目录浏览、web文件下载、等保安全风险问题风险…

QPaint绘制自定义仪表盘组件02

网上视频抄的&#xff0c;用来自己看一下&#xff0c;看完就删掉 最终效果 ui&#xff0c;创建一个空的widget widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QTimer>QT_BEGIN_NAMESPACE namespace Ui { c…

HCIA(11)OSPF 数据包构成(Hello、DBD、LSR、LSU、LSAck包)、状态机、工作流程(建立邻居关系、主从关系协商、LSDB同步)

OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用OSPF Version 2&#xff0c;针对IPv6协议使用OSPF Version 3。 在OSPF出现前&#xff0c;网络…

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理 各位大佬&#xff0c;这是我的自学笔记&#xff0c;如有错误请指正&#xff0c;也欢迎在评论区学习交流&#xff0c;谢谢&#xff01; CUDA编程模型 我们使用CUDA_C语言进行CUDA编程&am…

软考-中级-系统集成2023年综合知识(三)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 软考中级专栏回顾 专栏…

协议的概念+本质+作用+最终表现形式,网络问题(技术+应用+解决的协议+存在原因),主机的对称性

目录 协议 概念 示例 -- 摩斯密码 本质 作用 网络问题 引入 技术问题 应用问题 主机的对称性 问题对应的协议 问题出现的原因 理解协议(代码层面) 举例 -- 快递单 协议的最终表现形式 协议被双方主机认知的基础 协议 概念 协议是在计算机通信和数据传输中规定通…

CSAPP-计算机系统漫游

文章目录 概念扫盲思想理解经典好图 概念扫盲 1.主存由DRAM&#xff08;动态随机存储器&#xff09;组成 2.处理器的核心为PC&#xff08;程序计数器&#xff09;&#xff0c;大小为一个字 3.总线被设计为传送定长的字节块&#xff08;字&#xff09; 4.堆在运行时由malloc类型…

arcgisPro制图输出

1、设置地图底图 2、导入数据 3、 设置图形颜色&#xff0c;如下&#xff1a;右键“浙江省”数据层&#xff0c;选择符号系统 4、在右侧可看到打开的符号系统栏&#xff0c;进行如下设置: 5、移除“其他所有值”项&#xff0c;如下&#xff1a; 6、设置图形轮廓&#xff0c;如下…

一些可以参考的文档集合16

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5…

【Ubuntu】Anaconda的安装和使用

目录 1 安装 2 使用 1 安装 &#xff08;1&#xff09;下载安装包 官网地址&#xff1a;Unleash AI Innovation and Value | Anaconda 点击Free Download 按键。 然后 点击下图中的Download开始下载安装包。 &#xff08;2&#xff09;安装 在安装包路径下打开终端&#…

社区志愿者齐心协力,为社区居民营造温馨和谐环境

近日&#xff0c;在我们的社区里&#xff0c;一场温暖而有力的力量正在悄然兴起。一群热心居民自发组织成为社区志愿者团队&#xff0c;积极投身于服务社区的各项活动中&#xff0c;为居民们营造了一个温馨和谐的生活环境。 在每个周末的清晨&#xff0c;志愿者们早早地聚集在社…

新手入门C语言之移位操作符和位操作符

在C语言中&#xff0c;移位操作符和位操作符是专门针对二进制的数字进行&#xff0c;因此&#xff0c;在描述移位操作符和位操作符之前&#xff0c;我们先来了解十进制&#xff0c;二进制&#xff0c;八进制&#xff0c;十六进制等的含义以及相互之间的转化。 一.进制以及相互…