Android Compose 九:interactionSource 的使用

先上官方文档

InteractionSource
InteractionSource represents a stream of Interactions corresponding to events emitted by a component. These Interactions can be used to change how components appear in different states, such as when a component is pressed or dragged.
翻译
InteractionSource表示与组件发出的事件相对应的交互流。这些交互可用于更改组件在不同状态下的显示方式,例如按下或拖动组件时。

也就是说它应该是用来记录不同的交互状态
官方示例简化

val interactionSource = remember { MutableInteractionSource() }//拖拽
val draggable = Modifier.draggable(interactionSource = interactionSource,orientation = Orientation.Horizontal,state = rememberDraggableState { /* update some business state here */ }
)//点击
val clickable = Modifier.clickable(interactionSource = interactionSource,indication = LocalIndication.current
) { /* update some business state here */ }//状态值变化结果
val isDragged by interactionSource.collectIsDraggedAsState()
val isPressed by interactionSource.collectIsPressedAsState()//定义变化后的 text 和 color  下方Box 中 border使用了color    Text 使用了text
val (text, color) = when {isDragged && isPressed -> "Dragged and pressed" to Color.RedisDragged -> "Dragged" to Color.GreenisPressed -> "Pressed" to Color.Blue// Default / baseline stateelse -> "Drag me horizontally, or press me!" to Color.Black
}Box(Modifier.fillMaxSize().wrapContentSize().size(width = 240.dp, height = 80.dp)
) {Box(Modifier.fillMaxSize().then(clickable).then(draggable).border(BorderStroke(3.dp, color)).padding(3.dp)) {Text(text, style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),modifier = Modifier.fillMaxSize().wrapContentSize())}
}

将以上代码放入项目运行效果

  • 按下时 文字变化 边框边蓝
  • 拖拽时 文字变化 边框变绿
    请添加图片描述

官方示例2
以下是省略代码

 val interactions = remember { mutableStateListOf<Interaction>() }  //创建了个 集合
//用来记录 交互事件    添加或从集合中移除LaunchedEffect(interactionSource) {interactionSource.interactions.collect { interaction ->when (interaction) {is PressInteraction.Press -> interactions.add(interaction)is PressInteraction.Release -> interactions.remove(interaction.press)is PressInteraction.Cancel -> interactions.remove(interaction.press)is DragInteraction.Start -> interactions.add(interaction)is DragInteraction.Stop -> interactions.remove(interaction.start)is DragInteraction.Cancel -> interactions.remove(interaction.start)}}}//集合状态变化 文字变化val text = when (interactions.lastOrNull()) {is DragInteraction.Start -> "Dragged"is PressInteraction.Press -> "Pressed"else -> "No state"}//判断集合中 交互状态  显示不同的效果val pressed = interactions.any { it is PressInteraction.Press }Text(text = if (pressed) "Pressed" else "Not pressed",style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),modifier = Modifier.fillMaxSize().wrapContentSize())
val dragged = interactions.any { it is DragInteraction.Start }Text(text = if (dragged) "Dragged" else "Not dragged",style = LocalTextStyle.current.copy(textAlign = TextAlign.Center),modifier = Modifier.fillMaxSize().wrapContentSize())

效果
请添加图片描述

使用

前面我们玩过的
TextField
Button
Switch
等组件 都有 interactionSource 属性
并且
Modifier.indication(
interactionSource = interactionSource,
indication = LocalIndication.current
)
也可以设置interactionSource

下面我们就简单玩玩它

实现输入框获取到焦点时 提示文字的改变
  • collectIsDraggedAsState 拖拽交互
  • collectIsFocusedAsState 焦点交互
  • collectIsHoveredAsState 悬停交互
  • collectIsPressedAsState 点击交互

创建两个TextField 可以用来切换焦点
直接上代码吧

   val inPut = remember {mutableStateOf("")}val interactionSource = remember { MutableInteractionSource() }//获取到当前焦点状态val isFocused by interactionSource.collectIsFocusedAsState()Column(modifier = Modifier.padding(10.dp)) {TextField(value = inPut.value,onValueChange ={inPut.value = it},modifier = Modifier.fillMaxWidth().height(50.dp),shape = CircleShape,colors = TextFieldDefaults.textFieldColors(focusedIndicatorColor = Color.Transparent,disabledIndicatorColor = Color.Transparent,unfocusedIndicatorColor = Color.Transparent,),placeholder = {Text(text = "${if(isFocused)"请输入内容" else "这是一个提示语"}")},interactionSource = interactionSource,)Spacer(modifier = Modifier.height(20.dp))TextField(value = inPut.value,onValueChange ={inPut.value = it},modifier = Modifier.fillMaxWidth().height(50.dp),shape = CircleShape,colors = TextFieldDefaults.textFieldColors(focusedIndicatorColor = Color.Transparent,disabledIndicatorColor = Color.Transparent,unfocusedIndicatorColor = Color.Transparent,),placeholder = {Text(text = "这是一个提示语")},)}

效果 上边的TextField 获取和失去焦点时,文字改变
请添加图片描述
更多的用法一般是
当TextField 获取到焦点时边框或者背景变化 用以表示我们选中了该输入框
于是 我们包一层


@ExperimentalMaterial3Api
@Composable
fun MyTextField(value: String,onValueChange: (String) -> Unit,modifier: Modifier = Modifier,placeholder: @Composable (() -> Unit)? = null,
) {val interactionSource = remember { MutableInteractionSource() }//获取到当前焦点状态val isFocused by interactionSource.collectIsFocusedAsState()val color = when{isFocused -> Color.Redelse -> Color.Black}TextField(value = value,onValueChange = onValueChange,modifier = modifier.border(3.dp,color, shape = CircleShape),shape = CircleShape,colors = TextFieldDefaults.textFieldColors(focusedIndicatorColor = Color.Transparent,disabledIndicatorColor = Color.Transparent,unfocusedIndicatorColor = Color.Transparent,),placeholder = placeholder,interactionSource = interactionSource,)}

然后使用

   val inPut = remember {mutableStateOf("")}Column(modifier = Modifier.padding(10.dp)) {MyTextField(value = inPut.value,onValueChange ={inPut.value = it},modifier = Modifier.fillMaxWidth().height(50.dp),placeholder = {Text(text = "这是一个提示语")})Spacer(modifier = Modifier.height(20.dp))MyTextField(value = inPut.value,onValueChange ={inPut.value = it},modifier = Modifier.fillMaxWidth().height(50.dp),placeholder = {Text(text = "这是一个提示语")})}

效果如下
请添加图片描述

那么问题来了,你们叫它什么名字呢 状态选择器么

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

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

相关文章

温故而知新-Spring篇【面试复习】

温故而知新-Spring篇【面试复习】 前言版权推荐温故而知新-Spring篇IOCAOP循环依赖springboot如果要对属性文件中的账号密码加密如何实现&#xff1f;SpringBoot的优点Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f; 最后 前言 2023-7-31 15:…

Java RMI

RMI - 安全篇 RMI分为三个主体部分&#xff1a; *Client-客户端*&#xff1a;客户端调用服务端的方法 *Server-服务端*&#xff1a;远程调用方法对象的提供者&#xff0c;也是代码真正执行的地方&#xff0c;执行结束会返回给客户端一个方法执行的结果。 *Registry-注册中心…

python双色球选号程序的实现与解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;双色球选号游戏的魅力 二、程序设计与实现 1. 生成红色球号码 2. 生…

3.游戏中自定义数据类型的解读分析

知识来源于腾讯课堂易道云 结构的解释&#xff1a; 计算机里的所有东西都是用二进制表示的&#xff0c;二进制是数字&#xff0c;我们用的阿拉伯数字0-9这个数字是十进制&#xff0c;计算机用的是二进制只有0或1&#xff0c;然后都是一堆0或1的数字&#xff0c;游戏中怎么把这…

AD使用问题

设计流程&#xff1a; 1.先创建项目——添加原理图&#xff0c;原理图库&#xff0c;PCB&#xff0c;PCB库 2.画原理图库和封装库 主要有三种方法&#xff1a; &#xff08;1&#xff09;手动画库和封装&#xff0c;常常用于嘉立创查询不到的器件 &#xff08;2&#xff0…

双机多网口配置同网段地址,可以通过目的IP确定接收数据的网卡吗?

环境 两台机器两网卡同网段接入同一个二层交换机。 机器A ens38 00:0c:29:a4:8b:fb 10.0.0.11/24 ens39 00:0c:29:a4:8b:05 10.0.0.12/24 机器B ens38 00:0c:29:4f:a6:c4 10.0.0.21/24 ens39 00:0c:29:4f:a6:ce 10.0.0.22/24 初始ARP表 只有管理口接口的ARP表项&#xff0c…

浙江大学数据结构MOOC-课后习题-第十讲-排序4 统计工龄

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 这道题很明显就是利用桶排序的思路 受到课程内容的影响&#xff0c;我一开始是想着建立一个链表数组&#xff0c;数组内每个元素下方都存放链表&#xff0c;最后再遍历统计输出。 但是&…

【华为OD机试-C卷D卷-200分】反射计数(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 给定一个包含 0 和 1 的二维矩阵。 给定一个初始位置和速度,一个物体从给定的初始位置出发,在给定的速度下进行移动,遇到矩阵的边缘则发生镜面发射。 无论物体…

Android和flutter交互,maven库的形式导入aar包

记录遇到的问题&#xff0c;在网上找了很多资料&#xff0c;都是太泛泛了&#xff0c;使用后&#xff0c;还不能生效&#xff0c;缺少详细的说明&#xff0c;或者关键代码缺失&#xff0c;我遇到的问题用红色的标注了 导入aar包有两种模式 1.比较繁琐的&#xff0c;手动将aar…

The Sandbox DAO:投票决定元宇宙的未来!

赋予用户治理权&#xff0c;打造由社群运营的开放式数码国度 随着The Sandbox DAO的启动&#xff0c;我们邀请全球社群——这个新数字国度的公民们——提出建议并参与治理&#xff0c;共同塑造开放元宇宙的未来。 介绍 在The Sandbox&#xff0c;我们正在建立一个开放的元宇宙…

opencv c++编程基础

1、图片的本质 图像在 OpenCV 中的本质 在 OpenCV 中&#xff0c;图像被表示为一个多维数组&#xff0c;其中每个元素对应于图像中的单个像素。图像的维度取决于其通道数和像素数。 **通道数&#xff1a;**图像可以有多个通道&#xff0c;每个通道存储图像的不同信息。例如&…

李廉洋:5.22黄金原油高位震荡,今日最新行情分析策略。

黄金消息面分析&#xff1a;根据4月份的通胀数据&#xff0c;加拿大央行6月5日降息应该是“理所当然的”。加拿大的整体通货膨胀率在4月份降至2.7%&#xff0c;为自2021年初以来的最低水平&#xff0c;核心CPI中加拿大央行的两项首选数据均降至3%以下。加拿大央行在决定降息之前…

鸿蒙学习第一课--认识目录结构

项目结构介绍 module.json5 src > main > module.json5&#xff1a;Stage模型模块配置文件。主要包含HAP包的配置信息、应用/服务在具体设备上的配置信息以及应用/服务的全局配置信息。具体的配置文件说明&#xff0c;详见module.json5配置文件。 资源分类和访问 关于s…

awk编辑器

目录 工作原理 命令格式 普通格式 BEGIN格式 语句循环格式 awk常见的内建变量&#xff08;可直接用&#xff09; 按行打印行内容 统计行数量 按字段输出文本 通过管道、双引号调用 Shell 命令 awk编辑器是一种流编辑器 工作原理 逐行读取文本,默认以空格或tab键为分…

java第十八课 —— 重载、可变参数

方法重载 基本介绍 java 中允许同一个类中&#xff0c;多个同名方法的存在&#xff0c;但要求形参列表不一致&#xff01; 比如&#xff1a;System.out.println(); out 是 PrintStream 类型 重载的好处 减轻了起名的麻烦减轻了记名的麻烦 注意事项和使用细节 方法名&…

【Vue】Vue2中的Vuex

目录 Vuex介绍Vuex 中的核心概念 在vue2中使用Vuex安装 Vuex创建一个 Vuex Store在 Vue 实例中使用 Vuex编写 Vuex 的 state、mutations 和 actions在组件中使用 Vuex Vuex的核心State组件中获取 Vuex 的状态mapState 辅助函数对象展开运算符 Getter基本使用示例 通过属性访问通…

从多站点到多活,XEOS 对象数据容灾能力再提升

近日&#xff0c; XSKY SDS V6.4 新版本发布&#xff0c;其中 XEOS V6.4 全新升级并完善了统一命名空间功能&#xff0c;更进一步增强和完善了异地容灾方案&#xff0c;配合强一致代理读&#xff0c;可以实现异地多活&#xff1b;同时大幅降低管理复杂度&#xff0c;有效降低容…

TikTok电商带货特训营,跟随时代潮流,跨境掘金(8节课)

课程内容&#xff1a; 1-先导课 2-一、店铺运营认知与思路 3-二、店铺风控注意事项 4-三、美区Tiktok前期工作-1店铺入驻模式 5-三、美区Tiktok前期工作-2指纹浏览器介绍 6-三、美区Tiktok前期工作-4绑定电话号码 7-三、美区Tiktok前期工作-5添加仓库地址 8-三、美区Ti…

【秒杀系统】从零开始打造简易秒杀系统(一):防止超卖

【秒杀系统】从零开始打造简易秒杀系统&#xff08;一&#xff09;&#xff1a;防止超卖 前言 大家好&#xff0c;好久不发文章了。&#xff08;快一个月了- -&#xff09;最近有很多学习的新知识想和大家分享&#xff0c;但无奈最近项目蛮忙的&#xff0c;很多文章写了一半搁…

深入Java:JSON解析与操作的艺术

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、初识JSON&#xff1a;数据格式的优雅舞者 在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;以其轻量级和易于阅读的特点成为了数据交换的首选格式。它基于JavaScript的一个…