这一节主要了解一下Compose中的RangeSlider,在Jetpack Compose中,RangeSlider是Material3库提供的双滑块范围选择控件,用于在一个连续区间内选择最小值和最大值。它能直观地设置一个区间范围,广泛应用于筛选、过滤等场景,简单总结:

API:
value: ClosedFloatingPointRange<Float>,表示当前选中的范围,类型为Float的闭区间(如 0f..100f)
onValueChange: (ClosedFloatingPointRange<Float>)->Unit,用户滑动时触发的回调函数,参数为更新后的范围值。
valueRange: ClosedFloatingPointRange<Float>,定义滑块的总范围(最小值到最大值),默认为 0f..1f。
steps: Int,设置滑块的离散步长(即分段数)。
enabled: Boolean,控制滑块是否可交互,默认为true。
colors: SliderColors,自定义滑块的视觉样式,包括滑块颜色、轨道颜色等。
onValueChangeFinished:()->Unit,用户停止滑动时触发的回调函数。

场景
1 价格区间筛选
在电商或租房应用中,用户可通过RangeSlider选择价格范围(如100元-500元),动态过滤商品或房源列表。
2 数值范围调整
在音频/视频编辑工具中,用户可通过RangeSlider调整频率范围(如20Hz-20kHz)。
3 多参数联动控制
在图形处理应用中,用户可同时调整亮度(0-100)和对比度(0-100)的范围,实现精细化控制。

栗子:

import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp@Composable
fun PriceExample() {var priceRange by remember { mutableStateOf(100f..300f) }    val totalRange = 0f..500f    var displayText by remember { mutableStateOf("价格范围:¥100 - ¥300") }Column(modifier = Modifier.fillMaxWidth().padding(20.dp),horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.spacedBy(16.dp)) {Text("筛选价格", style = MaterialTheme.typography.titleMedium)RangeSlider(value = priceRange,onValueChange = { newRange ->priceRange = newRange},onValueChangeFinished = {displayText = "价格范围:¥${priceRange.start.toInt()} - ¥${priceRange.endInclusive.toInt()}"},valueRange = totalRange,steps = 9, // 分为10个间隔(0,50,100,...,500)colors = SliderDefaults.colors(activeTrackColor = MaterialTheme.colorScheme.primary,thumbColor = MaterialTheme.colorScheme.primary))Text(text = displayText,fontSize = 16.sp,color = MaterialTheme.colorScheme.onSurfaceVariant)Button(onClick = {priceRange = 100f..300fdisplayText = "价格范围:¥100 - ¥300"},modifier = Modifier.padding(top = 8.dp)) {Text("重置")}}
}
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp@Composable
fun VolumeExample() {var volumeRange by remember { mutableStateOf(20f..80f) }    var minVolumeText by remember { mutableStateOf(volumeRange.start.toInt().toString()) }var maxVolumeText by remember { mutableStateOf(volumeRange.endInclusive.toInt().toString()) }fun updateFromText() {val min = minVolumeText.toIntOrNull() ?: volumeRange.start.toInt()val max = maxVolumeText.toIntOrNull() ?: volumeRange.endInclusive.toInt()val validMin = min.coerceIn(0, 100)val validMax = max.coerceIn(validMin, 100)volumeRange = validMin.toFloat()..validMax.toFloat()}Column(modifier = Modifier.fillMaxWidth().padding(20.dp),horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.spacedBy(16.dp)) {Text("音量区间设置", style = MaterialTheme.typography.titleMedium)RangeSlider(value = volumeRange,onValueChange = { newRange ->volumeRange = newRangeminVolumeText = newRange.start.toInt().toString()maxVolumeText = newRange.endInclusive.toInt().toString()},valueRange = 0f..100f,steps = 0, // 连续滑动,无间隔colors = SliderDefaults.colors(activeTrackColor = MaterialTheme.colorScheme.secondary,inactiveTrackColor = MaterialTheme.colorScheme.surfaceVariant,thumbColor = MaterialTheme.colorScheme.secondary),modifier = Modifier.fillMaxWidth(0.8f))Row(modifier = Modifier.fillMaxWidth(0.8f),horizontalArrangement = Arrangement.spacedBy(16.dp),verticalAlignment = Alignment.CenterVertically) {Column(modifier = Modifier.weight(1f)) {Text("静音阈值", style = MaterialTheme.typography.labelSmall)OutlinedTextField(value = minVolumeText,onValueChange = { minVolumeText = it },keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),modifier = Modifier.fillMaxWidth(),singleLine = true)}Text("~", color = MaterialTheme.colorScheme.onSurfaceVariant)Column(modifier = Modifier.weight(1f)) {Text("最大音量", style = MaterialTheme.typography.labelSmall)OutlinedTextField(value = maxVolumeText,onValueChange = { maxVolumeText = it },keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),modifier = Modifier.fillMaxWidth(),singleLine = true)}}Button(onClick = ::updateFromText) {Text("应用设置")}}
}

注意:
1 状态管理
使用remember{mutableStateOf()}管理选中范围,确保UI与数据同步。
避免在onValueChange中执行耗时操作,应通过onValueChangeFinished触发最终逻辑。
2 离散与连续模式
连续模式(steps=0):允许任意值(如音量调节)。
离散模式(steps>0):值按步长分布(如价格筛选步长为10元)。
3 范围边界处理
确保valueRange总范围覆盖用户需求,防止start超过end,可通过逻辑校验或UI提示避免无效输入。
4 无障碍支持
为RangeSlider添加contentDescription,方便屏幕阅读器识别。
5 性能优化
避免在RangeSlider内部嵌套复杂逻辑,防止重绘卡顿。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

window10本地运行datax与datax-web

搭建 dataX 前置条件 JDK(1.8以上&#xff0c;推荐1.8)Python(2或3都可以)Apache Maven 3.x (Compile DataX) 下载 datax 编译好的包 https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.tar.gz 进入目录&#xff0c;使用 powershell 打开 执行解压命令…

PDF注释的加载和保存的实现

PDF注释功能文档 概述 本文档详细说明了PDF注释功能的实现&#xff0c;包括注释的加载和保存功能。该功能基于Android PDFBox库实现&#xff0c;支持Ink类型注释的读取和写入。 功能模块 1. 注释加载功能 (getAnnotation()) 功能描述 从PDF文件中加载已存在的注释&#xff0c;并…

Linux环境下实现简单TCP通信(c)

具体代码实现 server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define PORT 8080 #define BUFFER_SIZE 1024void handle_client(int client_s…

炫酷圆形按钮调色器

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>圆形按钮颜色控制器</title><style>bod…

Vue 3 的编译时优化如何改写 DOM 操作规则

在现代前端开发中&#xff0c;框架级优化正悄然改变我们处理性能瓶颈的方式。与手动优化策略不同&#xff0c;Vue 3 的编译器在构建阶段就完成了关键性能改造&#xff0c;为 DOM 操作效率带来质的飞跃。一、虚拟DOM的隐藏成本虚拟DOM&#xff08;Virtual DOM&#xff09;通过内…

Angular初学者入门第二课——.ts、.d.ts、.state.ts的区别(精品)

初次接触 Angular 实际项目时&#xff0c;发现里边有很多不同后缀的文件&#xff0c;虽然没深入研究过&#xff0c;但根据其他编程语言的经验猜测这应该是通过后缀名来区分文件的作用。后来有时间研究了一下具体的细节和不同点&#xff0c;就有了今天这篇文章&#xff0c;这些知…

进程状态+进程优先级+进程上下文切换解读

一、进程状态 什么是进程状态&#xff1f;进程状态指的是在操作系统中进程在生命周期中所处的不同阶段。进程状态有哪些呢&#xff1f;我们可以看到上述图片 进程状态分为&#xff1a;创建状态、就绪状态、运行状态、阻塞状态和终止状态所有的操作系统在实现进程状态变化的时候…

Android 原生与 Flutter 通信完整实现 (Kotlin 版)

1. 项目配置 pubspec.yaml 添加依赖 dependencies:flutter:sdk: flutterprovider: ^6.0.52. Flutter 端实现 状态管理类 // settings_provider.dart import package:flutter/foundation.dart;class SettingsProvider with ChangeNotifier {String _themeColor blue;bool _dark…

数字图像处理3

图像线性滤波——目的就是滤去噪声&#xff0c;但是边缘会模糊&#xff0c;整体也模糊线性&#xff1a;邻域平均法&#xff08;4邻域平均和8邻域平均&#xff09;用当前运算点所在邻域的平均值来代替该点的平均值im_for_read"D:\AAAproject\PYproject\EXPERuse\zaosheng.j…

Linux发行版分类与Centos替代品

让centos7气的不轻&#xff0c;这玩意儿太老了&#xff0c;什么都不好配置。 目录Linux 发行版的大致分类1. Red Hat 系列&#xff08;RPM 系&#xff09;2. Debian 系列&#xff08;DEB 系&#xff09;3. Arch 系列4. SUSE 系列CentOS 7 的替代品推荐AlmaLinux 和 Rocky Linux…

大语言模型提示工程与应用:大语言模型对抗性提示安全防御指南

对抗性提示工程 学习目标 理解大语言模型中对抗性提示的风险与防御机制&#xff0c;掌握提示注入、提示泄露和越狱攻击的检测方法&#xff0c;培养安全防护意识。 相关知识点 对抗性攻击类型防御技术 学习内容 1 对抗性攻击类型 1.1 提示注入 提示注入旨在通过使用巧妙…

避不开的数据拷贝(2)

接着上周未完的话题 避不开的数据拷贝。 既然处理器是通用机器&#xff0c;就没有专属数据&#xff0c;所以数据都要从别处调来&#xff0c;这就涉及到了数据搬运&#xff0c;就有了外设的概念。由于不同外设和处理器一起共享数据存储&#xff0c;时间会花在两方面&#xff1a…

娃哈哈经销商“大洗牌”:砍掉年销300万以下经销商

文 | 大力财经据第一财经报道&#xff0c;娃哈哈在宗馥莉“铁腕”策略推动下&#xff0c;正经历经销商体系的重大变革&#xff0c;陆续砍掉年销低于300万元的经销商&#xff0c;方式有时颇为激进&#xff0c;“一刀切”的做法引发诸多争议&#xff0c;部分经销商反馈存在款项未…

drippingblues靶机通关练习笔记

前言 将靶机导入到vmware虚拟机上 靶机下载地址&#xff1a;https://download.vulnhub.com/drippingblues/drippingblues.ova 将网段都设置为nat 信息收集 ip端口扫描 netdiscover -r 192.168.25.1/24 --确定ip nmap -A -p- 192.168.25. kalid的ip&#xff1a;1…

QT第三讲- 机制、宏、类库模块

文章目录 🧩 一、Qt核心机制与类库 🔧 1. 元对象系统(Meta-Object System) ⚡ 2. 信号与槽(Signals & Slots) • 通信机制 📦 3. 属性系统(Property System) 动态属性 例程 类的附加信息 Q_CLASSINFO 例程 🌐 二、全局定义与容器 📝 1. 全局数据类型与函数…

(LeetCode 每日一题) 869. 重新排序得到 2 的幂 (哈希表+枚举)

题目&#xff1a;869. 重新排序得到 2 的幂 思路&#xff1a;哈希表枚举。先预处理出所有的2的幂数&#xff0c;用哈希表来存储。 C版本&#xff1a; class Solution { public:// 哈希表存储所有 2的幂数 按升序排列的形式unordered_set<string> st;// 预处理出所有的2…

WebAssembly技术详解:从浏览器到云原生的高性能革命

引言&#xff1a;WebAssembly的诞生与使命 2015年&#xff0c;当Mozilla、Google、Microsoft和Apple四大浏览器厂商联合发布WebAssembly&#xff08;Wasm&#xff09;技术预览时&#xff0c;业界尚未意识到这将开启Web性能的新纪元。作为继HTML、CSS、JavaScript之后的第四种We…

性能解析案例

异步io是内核fd与应用程序直接的关系io 多路复用1.检测io是否就绪2.read/write消息队列kafka&#xff1a;1.典型应用 &#xff1a;异步处理&#xff0c;系统解耦&#xff0c;流量削峰&#xff0c;日志处理2.核心原理&#xff1a;kafka体系结构以及读写流程3.具体操作&#xff1…

青龙峡拔韭菜

我们一年四季&#xff0c;除了冬天不往山里进&#xff0c;其余季节&#xff0c;只要天气允许&#xff0c;我们都会进山。在山里拔韭菜&#xff0c;是我们百做不烦的一件事。今年大旱&#xff0c;从五月份上山找韭菜&#xff0c;没有如愿。直到入秋后&#xff0c;我们再次去青龙…

5、docker镜像管理命令

1、命令总览命令&#xff08;含关键参数&#xff09;作用出现频率备注docker buildx build --platform … -t … --push .一次构建并推送多平台镜像高频需先 docker buildx create --usedocker buildx build -o typedocker,destxxx.tar .构建后离线导出 tar 包中频只导出单平台…