Flutter_Slider_SliderTheme_滑杆/滑块_渐变色

news2024/11/28 4:40:16
  • 调用示例以及效果
		SliderTheme(
            data: SliderTheme.of(context).copyWith(
              trackHeight: 3,
              // 滑杆
              trackShape: const GradientRectSliderTrackShape(radius: 1.5),
              // 滑块
              thumbShape: const GradientSliderComponentShape(
                  rectWH: 14, overlayRectSpace: 4, overlayColor: Colours.black),
            ),
            child: Slider(
              value: 3,
              // 未滑动区域颜色
              inactiveColor: Color(0x55FFFFFF),
              min: 1,
              max: 10),
          )

UI效果

  • 滑杆渐变色
import 'package:flutter/material.dart';

class GradientRectSliderTrackShape extends SliderTrackShape
    with BaseSliderTrackShape {
  final double disabledThumbGapWidth;
  final double radius;
  final LinearGradient gradient;

  /// Creates a slider track that draws 2 rectangles.
  const GradientRectSliderTrackShape(
      {this.disabledThumbGapWidth = 2.0,
      this.radius = 0,
      this.gradient = const LinearGradient(
          colors: [Color(0xFFA2FFB7), Color(0xFF00FAED)])});

  
  Rect getPreferredRect({
    required RenderBox parentBox,
    Offset offset = Offset.zero,
    required SliderThemeData sliderTheme,
    bool isEnabled = false,
    bool isDiscrete = false,
  }) {
    final double overlayWidth =
        sliderTheme.overlayShape!.getPreferredSize(isEnabled, isDiscrete).width;
    final double trackHeight = sliderTheme.trackHeight ?? 2;
    assert(overlayWidth >= 0);
    assert(trackHeight >= 0);
    assert(parentBox.size.width >= overlayWidth);
    assert(parentBox.size.height >= trackHeight);

    final double trackLeft = offset.dx + overlayWidth / 2;
    final double trackTop =
        offset.dy + (parentBox.size.height - trackHeight) / 2;

    final double trackWidth = parentBox.size.width - overlayWidth;
    return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);
  }

  
  void paint(
    PaintingContext context,
    Offset offset, {
    required RenderBox parentBox,
    required SliderThemeData sliderTheme,
    required Animation<double> enableAnimation,
    required Offset thumbCenter,
    Offset? secondaryOffset,
    bool isEnabled = false,
    bool isDiscrete = false,
    required TextDirection textDirection,
  }) {
    assert(sliderTheme.disabledActiveTrackColor != null);
    assert(sliderTheme.disabledInactiveTrackColor != null);
    assert(sliderTheme.activeTrackColor != null);
    assert(sliderTheme.inactiveTrackColor != null);
    assert(sliderTheme.thumbShape != null);

    if (sliderTheme.trackHeight! <= 0) {
      return;
    }

    final Rect trackRect = getPreferredRect(
      parentBox: parentBox,
      offset: offset,
      sliderTheme: sliderTheme,
      isEnabled: isEnabled,
      isDiscrete: isDiscrete,
    );

    final ColorTween activeTrackColorTween = ColorTween(
        begin: sliderTheme.disabledActiveTrackColor,
        end: sliderTheme.activeTrackColor);

    final ColorTween inactiveTrackColorTween = ColorTween(
        begin: sliderTheme.disabledInactiveTrackColor,
        end: sliderTheme.inactiveTrackColor);

    final Paint activePaint = Paint()
      ..shader = gradient.createShader(trackRect)
      ..color = activeTrackColorTween.evaluate(enableAnimation)!;

    final Paint inactivePaint = Paint()
      ..color = inactiveTrackColorTween.evaluate(enableAnimation)!;

    final Paint leftTrackPaint;
    final Paint rightTrackPaint;

    switch (textDirection) {
      case TextDirection.ltr:
        leftTrackPaint = activePaint;
        rightTrackPaint = inactivePaint;
        break;
      case TextDirection.rtl:
        leftTrackPaint = inactivePaint;
        rightTrackPaint = activePaint;
        break;
    }
    double horizontalAdjustment = 0.0;
    if (!isEnabled) {
      final double disabledThumbRadius =
          sliderTheme.thumbShape!.getPreferredSize(false, isDiscrete).width /
              2.0;
      final double gap = disabledThumbGapWidth * (1.0 - enableAnimation.value);
      horizontalAdjustment = disabledThumbRadius + gap;
    }

    //进度条两头圆角
    final RRect leftTrackSegment = RRect.fromLTRBR(
        trackRect.left,
        trackRect.top,
        thumbCenter.dx - horizontalAdjustment,
        trackRect.bottom,
        Radius.circular(radius));
    context.canvas.drawRRect(leftTrackSegment, leftTrackPaint);
    final RRect rightTrackSegment = RRect.fromLTRBR(
        thumbCenter.dx + horizontalAdjustment,
        trackRect.top,
        trackRect.right,
        trackRect.bottom,
        Radius.circular(radius));
    context.canvas.drawRRect(rightTrackSegment, rightTrackPaint);
  }
}

  • 滑块渐变色
import 'package:flutter/material.dart';

class GradientSliderComponentShape extends SliderComponentShape {
  final double rectWH;
  final double overlayRectSpace;
  final LinearGradient thumbGradient;
  final Color? overlayColor;
  const GradientSliderComponentShape(
      {required this.rectWH,
      required this.overlayRectSpace,
      this.thumbGradient =
          const LinearGradient(colors: [Color(0xFFA2FFB7), Color(0xFF00FAED)]),
      this.overlayColor});

  
  Size getPreferredSize(bool isEnabled, bool isDiscrete) {
    return const Size(0, 0);
  }

  
  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;
    // 点击滑块时阴影
    // canvas.drawShadow(
    //     Path()
    //       ..addRRect(RRect.fromRectAndRadius(
    //         Rect.fromCenter(center: center, width: 38, height: 34),
    //         const Radius.circular(19),
    //       )),
    //     Colors.red,
    //     5,
    //     false);
    double overlayWH = rectWH + overlayRectSpace;
    // 滑块描边
    canvas.drawRRect(
      RRect.fromRectAndRadius(
        Rect.fromCenter(center: center, width: overlayWH, height: overlayWH),
        Radius.circular(overlayWH / 2),
      ),
      Paint()
        ..color = (overlayColor != null)
            ? overlayColor!
            : const Color.fromARGB(255, 252, 241, 216),
    );
    // 滑块内
    canvas.drawRRect(
        RRect.fromRectAndRadius(
          Rect.fromCenter(center: center, width: rectWH, height: rectWH),
          Radius.circular(rectWH / 2),
        ),
        Paint()
          ..shader = thumbGradient.createShader(
              Rect.fromCenter(center: center, width: rectWH, height: rectWH)));
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络模型之OSI七层网络模型、TCP/IP四层网络模型

一、计算机网络是什么&#xff1f; 计算机网络是指由通讯网络相互连接的许多自主工作的计算机构成的集合体。 二、网络模型是干什么的&#xff1f; 网络模型就是研究计算机网络中各个部件是以何种规则进行通行。 三、OSI七层网络模型 OSI 是 Open System Interconnection 的…

【Amazon】基于AWS云实例(CentOS 7.9系统)使用kubeadm方式搭建部署Kubernetes集群1.25.4版本

文章目录 前言实验架构介绍K8S集群部署方式说明使用CloudFormation部署EC2实例集群环境准备修改主机名并配置域名解析&#xff08;ALL节点&#xff09;禁用防火墙禁用SELinux加载br_netfilter模块安装ipvs安装 ipset 软件包同步服务器时间关闭swap分区安装Containerd 初始化集群…

40V汽车级P沟道MOSFET SQ4401EY-T1_GE3 工作原理、特性参数、封装形式—节省PCB空间,更可靠

AEC-Q101车规认证是一种基于失效机制的分立半导体应用测试认证规范。它是为了确保在汽车领域使用的分立半导体器件能够在严苛的环境条件下正常运行和长期可靠性而制定的。AEC-Q101认证包括一系列的失效机制和应力测试&#xff0c;以验证器件在高温、湿度、振动等恶劣条件下的可…

97 # session

koa 里的 cookie 用法 koa 里内置了设置 cookie 的方法 npm init -y npm i koa koa/router用法&#xff1a; const Koa require("koa"); const Router require("koa/router"); const crypto require("crypto");const app new Koa(); let …

10_8C++

X-Mind #include <iostream>using namespace std; class Rect { private:int width;int heigjt; public:void init(int w,int h){width w;heigjt h;}void set_w(int w){width w;}void set_h(int h){heigjt h;}void show(){cout << "矩形的周长" <…

【算法练习Day15】平衡二叉树二叉树的所有路径左叶子之和

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 平衡二叉树二叉树的所有路径…

C++并发与多线程(3) | 其他创建线程的方式

1. 用类(可调用对象) 必须要重载括号运算符,否则不是可调用对象。这种方式其实就是一个仿函数。 示例: #include <iostream> #include <thread> using namespace std;class TA { public:void operator() ()// 不能带参数 {cout << "子线程operato…

外汇天眼:一步错步步错,投资者表示真后悔遇到DIFX杀猪盘

随着现在大互联网时代的发展&#xff0c;外汇投资变得越来越普及&#xff0c;因为外汇的特殊性&#xff0c;很多交易都是通过互联网进行的&#xff0c;但面对良莠不齐的外汇平台&#xff0c;投资者若不能对这些平台进行筛选&#xff0c;极易陷入一些黑平台精心设计的诈骗陷阱内…

第八章 排序 十二、败者树

一、多路平衡带来的问题 二、败者树的构造 三、败者树在K路平衡归并中的应用 1、我们有如下例子 2、接着我们构造一棵败者树&#xff0c;并且选出最小的数的归并段序号 3、接着把归并段3的数据填充进入败者树&#xff0c;这次最多只需要和之前的胜者比3次就能得到最终胜者 也…

SpringCloudGateway网关整合swagger3+Knife4j3,basePath丢失请求404问题

在集成 Spring Cloud Gateway 网关的时候&#xff0c;会出现没有 basePath 的情况&#xff0c;例如定义的 /jeeplus-auth、/jeeplus-system 等微服务前缀导致访问接口404&#xff1a; maven依赖&#xff1a; swagger2于17年停止维护&#xff0c;现在最新的版本为 Swagger3&am…

光引擎、光模块、光器件之间的关系和区别

最近小编有收到一些用户问“光引擎、光模块、光器件之间的关系和区别&#xff1f;”&#xff0c;众所周知光通信技术一直在不断演进&#xff0c;为满足不断增长的数据传输需求提供了强大的解决方案。而光通信系统中&#xff0c;光引擎、光模块和光器件是关键的组成部分&#xf…

2023-10-07 LeetCode每日一题(股票价格跨度)

2023-10-07每日一题 一、题目编号 901. 股票价格跨度二、题目链接 点击跳转到题目位置 三、题目描述 设计一个算法收集某些股票的每日报价&#xff0c;并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数&#xff08…

Openfire身份认证绕过漏洞

漏洞详情&#xff1a; Openfire是采用Java编程语言开发的实时协作服务器&#xff0c;Openfire的管理控制台是一个基于Web的应用程序&#xff0c;被发现可以使用路径遍历的方式绕过权限校验。未经身份验证的用户可以访问Openfire管理控制台中的后台页面。同时由于Openfire管理控…

情侣飞行棋情侣游戏源码

之前的链接失效了&#xff0c;所以重新补充一个 最近很火的抖音上非常火的东西 首先是源码下载地址&#xff1a; http://pan.xiaou61.top/down.php/892e381f7cdb508b5ac55fc9fc0047b3.zip 然后是演示地址&#xff1a; http://fxq.xiaou61.top/#/ 2023最新情侣飞行棋源码 最新情…

bigemap在林业勘测规划设计行业的一些应用

选择Bigemap的原因&#xff1a; 主要注重影像的时效性&#xff0c;软件的影像时效性比其他的更新快&#xff0c;更清晰。 使用场景&#xff1a; 1.林业督查&#xff0c;主要是根据国家下发的图斑&#xff0c;结合测绘局的影像以及bigemap的较新影像对比去年和今年的林地变化。…

php生成海报和指定文字

public function createPoster($parmas){$content mb_convert_encoding(这是一张海报, "html-entities", "utf-8");$config array(text>array(array(text>$content,left>500,top>100,fontPath>C:\Users\ahuyikao\Desktop\Alibaba-PuHuiTi…

Python算法练习 10.8

leetcode 2352 相等行列对 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid &#xff0c;返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和列以相同的顺序包含相同的元素&#xff08;即相等的数组&#xff09;&#xff0c;则认为二者是相等的。 输入&am…

C语言:常量

目录 C语言中的常量分为以下以下几种&#xff1a; 字面常量 const修饰的常变量 #define定义的标识符常量 枚举常量 C语言中的常量分为以下以下几种&#xff1a; 字面常量const修饰的常变量#define定义的标识符常量枚举常量 字面常量 const修饰的常变量 在c语言中&#xff…

【本地方法接口和本地方法栈】

文章目录 简单地讲&#xff0c; 一个 Native Method 是一个 Java 调用非 Java 代码的接囗。一个 Native Method 是这样一个 Java 方法&#xff1a;该方法的实现由非 Java 语言实现&#xff0c;比如 C。 Java 虚拟机栈于管理 Java 方法的调用&#xff0c;而本地方法栈用于管理本…

【MySQL】就这一篇帮你解决 MySQL 磁盘占用过高的问题

这篇博客主要是来解决 mysql 落盘日志占用磁盘空间过大的问题。我是用 docker 启动的 mysql&#xff0c;然后把 /var/lib/mysql 挂载到宿主机上。有人反馈网页点击无反应&#xff0c;我想的是这么简单&#xff0c;也没改动怎么会报错呢。上服务器&#xff0c;刚好无意看了下 df…