Flutter_Slider_SliderTheme_滑杆/滑块_渐变色

2024-03-17 21:20

本文主要是介绍Flutter_Slider_SliderTheme_滑杆/滑块_渐变色,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 调用示例以及效果
		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 SliderTrackShapewith 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)));}
}

这篇关于Flutter_Slider_SliderTheme_滑杆/滑块_渐变色的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/820200

相关文章

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Flutter Button使用

Material 组件库中有多种按钮组件如ElevatedButton、TextButton、OutlineButton等,它们的父类是于ButtonStyleButton。         基本的按钮特点:         1.按下时都会有“水波文动画”。         2.onPressed属性设置点击回调,如果不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击。

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题 GitHub Pages是一个直接从GitHub存储库托管的静态站点服务,‌它允许用户通过简单的配置,‌将个人的代码项目转化为一个可以在线访问的网站。‌这里使用flutter build web来构建web发布到GitHub Pages。 最近通过flutter build web,通过发布到GitHu

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加,控制这些设备的需求也在增加。对于多种使用情况,期望设备在需要进行控制的同时连接到互联网会受到很大限制,因此是不可行的。在这些情况下,使用低功耗蓝牙(也称为 Bluetooth LE 或 BLE)似乎是最佳选择,因为它功耗低,在我们的手机中无处不在,而且无需连接到更广泛的网络。因此,蓝牙应用程序的需求也在不断增长。 通过阅读本文,您将了解如何开始在 Flutter 中开

flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)

前文 Flutter 是一个跨平台的开发框架,它允许开发者使用相同的代码库来构建 iOS、Android、Web 和桌面应用程序。 上文flutter开发多端平台应用的探索 上(基本操作)-CSDN博客列举了一些特定平台的case(桌面端菜单,鼠标快捷键)的使用方法,有些是flutter提供了对应能力,只需要学习如何调API,有些事三方库支持,本文要探讨的平台通道是更为强大的工具,很多三方插件

Flutter-使用dio插件请求网络(get ,post,下载文件)

引入库:dio: ^2.1.13可直接运行的代码:包含了post,get 下载文件import 'package:flutter/material.dart';import 'package:dio/dio.dart';void main() {runApp(new MaterialApp(title: 'Container demo',home: new visitNetPage(),)

Flutter-选择附件,图片,视频。file_picker

仅供参考: 引入插件: file_picker: ^1.3.8 按照返回值,分了三组: // Single file path String filePath;第一组:返回文件地址 //选择任何文件 filePath = await FilePicker.getFilePath(type: FileType.ANY); // will let you pick one file path, fr

Flutter-图表显示charts_flutter

引入插件: charts_flutter: ^0.4.0 ChartFlutterBean import 'package:charts_flutter/flutter.dart';import 'package:myself_project/OrdinalSales%20.dart';class ChartFlutterBean {static List<Series<TimeSer