乐都网站建设哪家好/万江专业网站快速排名

乐都网站建设哪家好,万江专业网站快速排名,天元建设集团有限公司第一建筑工程公司,app介绍网站模板Compose 手势处理,增进交互体验 概述常用手势处理Modifierclickable()combinedClickable()draggable()swipeable()transformable()scrollable()nestedScrollNestedScrollConnectionNestedScrollDispatcher 定制手势处理使用 PointerInput ModifierPointerInputScope…

Compose 手势处理,增进交互体验

  • 概述
  • 常用手势处理Modifier
    • clickable()
    • combinedClickable()
    • draggable()
    • swipeable()
    • transformable()
    • scrollable()
    • nestedScroll
      • NestedScrollConnection
      • NestedScrollDispatcher
  • 定制手势处理
    • 使用 PointerInput Modifier
      • PointerInputScope
    • awaitPointerEventScope

概述

在处理手势时,应将手势处理修饰符尽可能放到 Modifier 末尾,从而可以避免产生不可预期的行为。

常用手势处理Modifier

clickable()

监听点击事件,在绝大多数情况下,只需要出入 onClick 回调即可。当然也可以将 enable 参数设置为一个可变状态,通过状态来动态控制启用点击监听。

@Composable
private fun GestureOfClick(){var colorState by remember { mutableStateOf(false) }Box(modifier = Modifier.size(60.dp).background(color = if (colorState) Color.LightGray else Color.Gray).clickable { colorState = !colorState },contentAlignment = Alignment.Center){Text(text = "点击")}
}

combinedClickable()

和 clickable() 类似,但支持长按/双击/单击:

// Clickable.kt
fun Modifier.combinedClickable(enabled: Boolean = true,onClickLabel: String? = null,role: Role? = null,onLongClickLabel: String? = null,onLongClick: (() -> Unit)? = null,onDoubleClick: (() -> Unit)? = null,onClick: () -> Unit
)

draggable()

只支持检测单一方向的拖动(水平方向或垂直方向),不支持同时监听两个方向上的拖动偏移,要实现这种效果,需要使用更底层的 PointerInputModifier。

fun Modifier.draggable(state: DraggableState,//用于获取拖动手势偏移量,并且允许动态控制发生偏移行为。orientation: Orientation,//拖动手势方向enabled: Boolean = true,//是否启用拖动手势监听。 interactionSource: MutableInteractionSource? = null,//监听组件的拖动、按压、悬停、焦点等状态startDragImmediately: Boolean = false,//是否立即开始拖动。onDragStarted: suspend CoroutineScope.(startedPosition: Offset) -> Unit = {},//拖动开始的回调。onDragStopped: suspend CoroutineScope.(velocity: Float) -> Unit = {},//拖动结束的回调。reverseDirection: Boolean = false//是否反转方向。
): Modifier

swipeable()

可以拖动元素,释放后,这些元素通常朝一个方向定义的两个或多个锚点继续滑动以呈现动画效果。其常见用途是实现“滑动关闭”模式。

必传的参数有:

  • state:是一个SwipeableState,可以记录当前的偏移数据
  • anchors:锚点,用来记录不同滑动数据对应的状态
  • orientation:滑动方向
  • thresholds:不同锚点之间的临界值

transformable()

多点触控,在日常生活当中,多点触控这样的操作多数是在浏览图片,网页或者地图之类的场景下被用到
transformable有三个参数:

  • state:TransformableState,用来获取多点触控时候目标组件大小,位移,旋转角度变化情况的
  • lockRotationOnZoomPan:Boolean,这个参数的意思是如果设置为false,那么多点触控的时候将会同时监听双指拖动,缩放以及旋转,但是如果设置为true的时候,除非旋转动作比其余两个动作先执行,这样会被监听到,不然的话,只会监听双指拖动和缩放动作,旋转事件将不会被监听
  • enabled:Boolean,是否可用
@Composable
private fun TransformableSample() {// set up all transformation statesvar scale by remember { mutableStateOf(1f) }var rotation by remember { mutableStateOf(0f) }var offset by remember { mutableStateOf(Offset.Zero) }val state = rememberTransformableState { zoomChange, offsetChange, rotationChange ->scale *= zoomChangerotation += rotationChangeoffset += offsetChange}Box(Modifier// apply other transformations like rotation and zoom// on the pizza slice emoji.graphicsLayer(scaleX = scale,scaleY = scale,rotationZ = rotation,translationX = offset.x,translationY = offset.y)// add transformable to listen to multitouch transformation events// after offset.transformable(state = state).background(Color.Blue).fillMaxSize())
}

scrollable()

虽然 verticalScroll() / horizontalScroll() 和 scrollable() 的名字很像,但它们并不是相同的东西,scrollable() 修饰符仅负责检测滚动手势,并不会帮我们自动偏移元素内容,滚动行为由开发者定义,用法类似 draggable() 修饰符

var offsetX by remember { mutableFloatStateOf(0f) }
Column {Text(text = "OffsetX: $offsetX")Box(Modifier.size(200.dp).background(Pink).scrollable(// 检测水平方向的滚动手势orientation = Orientation.Horizontal,// 使用 rememberScrollableState 创建并传递一个 ScrollableState 对象。// 通过 ScrollableState 可以获取到滚动手势的偏移量,进一步定义滚动行为。state = rememberScrollableState { delta ->offsetX += deltadelta // 为了支持嵌套滚动,必须返回消费的滚动距离量}))
}

nestedScroll

嵌套滑动,需要传递两个参数,connection: NestedScrollConnection 和 dispatcher: NestedScrollDispatcher,源码如下:

fun Modifier.nestedScroll(connection: NestedScrollConnection,dispatcher: NestedScrollDispatcher? = null
){...}
  1. connection:包含了嵌套滑动的和姓逻辑,通过回调可以在子布局获得滑动事件前,预先消费掉部分或全部手势偏移量,当然也可以获取子布局消费后剩下的手势偏移量。
  2. dispatcher:包含用于父布局的NestedScrollConnection,可以使用包含的 dispatch**系列方法动态控制组件完成滑动。

NestedScrollConnection

interface NestedScrollConnection {fun onPreScroll(available: Offset, source: NestedScrollSource): Offset = Offset.Zerofun onPostScroll(consumed: Offset,available: Offset,source: NestedScrollSource): Offset = Offset.Zerosuspend fun onPreFling(available: Velocity): Velocity = Velocity.Zerosuspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {return Velocity.Zero}
}
  • onPreScroll:在子控件滑动之前,会先使用NestedScrollDispatcher询问父控件是否需要消费available的偏移量,父控件可以在该方法内计算自身需要消费的量,然后返回自身消费了的偏移量。
  • onPostScroll:在子控件滑动之后,会使用NestedScrollDispatcher通知父控件,告知其consumed的偏移量以及剩余available的偏移量,而父控件则可以根据情况判断是否还要再偏移,以及使用和子控件同等的偏移还是剩余的偏移。完成之后返回自身消费了的偏移量
  • onPreFling:在子控件进行惯性滑行之前,会先使用NestedScrollDispatcher询问父控件是否需要消费available的速度值,父控件可以在该方法内计算自身需要消费的量,然后返回自身消费了的速度值
  • onPostFling:在子控件进行惯性滑行之后,会使用NestedScrollDispatcher通知父控件,告知其consumed的速度值以及剩余available的速度值,而父控件则可以根据情况判断是否还要再偏移,以及使用和子控件同等的速度还是剩余的速度。完成之后返回自身消费了的速度值。

一句话概括:在滑动前父控件可以通过onPreScroll回调先消费部分或全部偏移量;待子控件消费完后,父控件依旧可以通过onPostScroll方法进行消费,区别在于在onPreScroll回调中,父控件是优先消费的,而onPostScroll则是子控件优先消费,fling的两个方法同理。

NestedScrollDispatcher

class NestedScrollDispatcher {// ....// 在滑动之前调用,将可用的偏移量传递给父控件fun dispatchPreScroll(available: Offset, source: NestedScrollSource): Offset {return parent?.onPreScroll(available, source) ?: Offset.Zero}//在滑动之后调用,将已经消费的偏移量以及剩余可用的偏移量传递给父控件fun dispatchPostScroll(consumed: Offset,available: Offset,source: NestedScrollSource): Offset {return parent?.onPostScroll(consumed, available, source) ?: Offset.Zero}//在滑动之后,如果产生了惯性滑动,那么需要将相应的速度值传递给父控件suspend fun dispatchPreFling(available: Velocity): Velocity {return parent?.onPreFling(available) ?: Velocity.Zero}//在惯性滑动之后,需要将已经消费了的速度值以及剩余可用的速度值传递给父控件suspend fun dispatchPostFling(consumed: Velocity, available: Velocity): Velocity {return parent?.onPostFling(consumed, available) ?: Velocity.Zero}

一句话概括:通过dispatchPreScroll方法询问父控件是否需要消费,方法返回的就是父控件消费了的量,然后就可以做自己的滑动操作了,在滑动完成之后,再通过dispatchPostScroll方法通知父控件。

定制手势处理

前面提到的手势处理修饰符都是基于低级别的 pointerInput 修饰符进行封装实现的。

使用 PointerInput Modifier

// SuspendingPointerInputFilter.kt
fun Modifier.pointerInput(key1: Any?, block: suspend PointerInputScope.() -> Unit
): Modifier
  • keys:当 Composable 发生重组时,如果传入的 keys 发生了变化,则手势事件处理过程会被中断
  • block:在这个 PointerInputScope 作用域代码块中,变可以声明手势事件的处理逻辑了,发生在协程中。

PointerInputScope

  • detectTapGestures():设置更细粒度的点击监听回调
  • detectDragGestures():设置更细粒度的拖动手势监听回调
  • detectTransformGestures():双指拖动、缩放与旋转手势操作中更具体的手势信息
  • detectDragGesturesAfterLongPress():监听长按后的拖动手势
  • detectHorizontalDragGestures():监听水平拖动手势
  • detectVerticalDragGestures():监听垂直拖动手势
  • forEachGesture:允许用户可以对每一个手势事件序列进行相同的定制处理

awaitPointerEventScope

AwaitPointerEventScope 作用域中,可以使用 Compose 中所有低级别的手势处理挂起方法。

suspend fun <R> awaitPointerEventScope(block: suspend AwaitPointerEventScope.() -> R
): R
API名称作用
awaitPointerEvent手势事件
awaitFirstDown第一根手指的按下事件
drag拖动事件
horizontalDrag水平拖动事件
verticalDrag垂直拖动事件
awaitDragOrCancellation单次拖动事件
awaitHorizontalDragOrCancellation单次水平拖动事件
awaitVerticalDragOrCancellation单次垂直拖动事件
awaitTouchSlopOrCancellation有效拖动事件
awaitHorizontalTouchSlopOrCancellation有效水平拖动事件
awaitVerticalTouchSlopOrCancellation有效垂直拖动事件

参考资料:巧用Compose来实现手势拖拽效果

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

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

相关文章

ue5 3dcesium中从本地配置文件读取路3dtilles的路径

关卡蓝图中获得3dtiles的引用 拉出设置url 设置路径 至于设置的路径从哪里来 可以使用varest读取文件里的接送字符串 path中配置地址 path变量的值为: Data/VillageStartMapConfig.json此地址代表content的地下的data文件夹里的config.json文件 {"FilePath": &quo…

音视频入门基础:RTP专题(12)——RTP中的NAL Unit Type简介

一、引言 RTP封装H.264时&#xff0c;RTP对NALU Header的nal_unit_type附加了扩展含义。 由《音视频入门基础&#xff1a;H.264专题&#xff08;4&#xff09;——NALU Header&#xff1a;forbidden_zero_bit、nal_ref_idc、nal_unit_type简介》可以知道&#xff0c;nal_unit…

学习记录:初次学习使用transformers进行大模型微调

初次使用transformers进行大模型微调 环境&#xff1a; 电脑配置&#xff1a; 笔记本电脑&#xff1a;I5&#xff08;6核12线程&#xff09; 16G RTX3070&#xff08;8G显存&#xff09; 需要自行解决科学上网 Python环境&#xff1a; python版本:3.8.8 大模型&#xff1a…

【Java学习】Object类与接口

面向对象系列五 一、引用 1.自调传自与this类型 2.类变量引用 3.重写时的发生 二、Object类 1.toString 2.equals 3.hashCode 4.clone 三、排序规则接口 1.Comparable 2.Comparator 一、引用 1.自调传自与this类型 似复刻变量调用里面的非静态方法时&#xff0c;都…

OpenEuler学习笔记(三十五):搭建代码托管服务器

以下是主流的代码托管软件分类及推荐&#xff0c;涵盖自托管和云端方案&#xff0c;您可根据团队规模、功能需求及资源情况选择&#xff1a; 一、自托管代码托管平台&#xff08;可私有部署&#xff09; 1. GitLab 简介: 功能全面的 DevOps 平台&#xff0c;支持代码托管、C…

Transformer 架构 理解

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; Transformer 架构&#xff1a;encoder/decoder 内部细节。 的介绍&#xff0c;说明 Transformer 架构相比当时主流的 RNN/CNN 架构的创新之处&#xff1a; 在 transformer 之前&#xff0c;最先进的架构…

事务的4个特性和4个隔离级别

事务的4个特性和4个隔离级别 1. 什么是事务2. 事务的ACID特性2.1 原子性2.2 一致性2.3 持久性2.4 隔离性 3. 事务的创建4. 事务并发时出现的问题4.1 DIRTY READ 脏读4.2 NON - REPEATABLR READ 不可重复读4.3 PHANTOM READ 幻读 5. 事务的隔离级别5.1 READ UNCOMMITTED 读未提交…

LeetCode热题100- 字符串解码【JavaScript讲解】

古语有云&#xff1a;“事以密成&#xff0c;语以泄败”&#xff01; 关于字符串解码&#xff1a; 题目&#xff1a;题解&#xff1a;js代码&#xff1a;代码中遇到的方法&#xff1a;repeat方法&#xff1a;为什么这里不用this.strstack.push(result)&#xff1f; 题目&#x…

水利工程安全包括哪几个方面

水利工程安全培训的内容主要包括以下几个方面&#xff1a; 基础知识和技能培训 &#xff1a; 法律法规 &#xff1a;学习水利工程相关的安全生产法律法规&#xff0c;了解安全生产标准及规范。 事故案例 &#xff1a;通过分析事故案例&#xff0c;了解事故原因和教训&#x…

浅谈新能源汽车充电桩建设问题分析及解决方案

摘要&#xff1a; 在全球倡导低碳减排的大背景下&#xff0c;新能源成为热门行业在全球范围内得以开展。汽车尾气排放会在一定程度上加重温室效应&#xff0c;并且化石能源的日渐紧缺也迫切对新能源汽车发展提出新要求。现阶段的新能源汽车以电力汽车为主&#xff0c;与燃油汽…

05-1基于vs2022的c语言笔记——运算符

目录 前言 5.运算符和表达式 5-1-1 加减乘除运算符 1.把变量进行加减乘除运算 2.把常量进行加减乘除运算 3.对于比较大的数&#xff08;往数轴正方向或者负方向&#xff09;&#xff0c;要注意占位符的选取 4.浮点数的加减乘除 5-1-2取余/取模运算符 1.基本规则 2.c语…

0—QT ui界面一览

2025.2.26&#xff0c;感谢gpt4 1.控件盒子 1. Layouts&#xff08;布局&#xff09; 布局控件用于组织界面上的控件&#xff0c;确保它们的位置和排列方式合理。 Vertical Layout&#xff08;垂直布局&#xff09; &#xff1a;将控件按垂直方向排列。 建议&#xff1a;适…

Apache Doris 索引的全面剖析与使用指南

搞大数据开发的都知道&#xff0c;想要在海量数据里快速查数据&#xff0c;就像在星图里找一颗特定的星星&#xff0c;贼费劲。不过别慌&#xff0c;数据库索引就是咱们的 “定位神器”&#xff0c;能让查询效率直接起飞&#xff01;就拿 Apache Doris 这个超火的分析型数据库来…

从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?

本文首发&#xff1a;从零到一&#xff1a;如何用阿里云百炼和火山引擎搭建专属 AI 助手&#xff08;DeepSeek&#xff09;&#xff1f; 阿里云百炼和火山引擎都推出了免费的 DeepSeek 模型体验额度&#xff0c;今天我和大家一起搭建一个本地的专属 AI 助手。  阿里云百炼为 …

cpp中的继承

一、继承概念 在cpp中&#xff0c;封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类&#xff08;也就是基类&#xff09;的基础上创建新类&#xff08;派生类或者子类&#xff09;&#xff0c;从而实现代码的复用。 如上图所示&#xff0c;Person是基类&…

【QT】QLinearGradient 线性渐变类简单使用教程

目录 0.简介 1&#xff09;qtDesigner中 2&#xff09;实际执行 1.功能详述 3.举一反三的样式 0.简介 QLinearGradient 是 Qt 框架中的一个类&#xff0c;用于定义线性渐变效果&#xff08;通过样式表设置&#xff09;。它可以用来填充形状、背景或其他图形元素&#xff0…

网络安全学习-常见web漏洞的渗xxx透以及防护方法

渗XX透测试 弱口令漏洞 漏洞描述 目标网站管理入口&#xff08;或数据库等组件的外部连接&#xff09;使用了容易被猜测的简单字符口令、或者是默认系统账号口令。 渗XX透测试 如果不存在验证码&#xff0c;则直接使用相对应的弱口令字典使用burpsuite 进行爆破如果存在验证…

网络安全 机器学习算法 计算机网络安全机制

&#xff08;一&#xff09;网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型&#xff1a; 自主访问控制强制访问控制 访问控制措施&#xff1a; 入…

2025网络安全等级测评报告,信息安全风险评估报告(Word模板)

一、概述 1.1工作方法 1.2评估依据 1.3评估范围 1.4评估方法 1.5基本信息 二、资产分析 2.1 信息资产识别概述 2.2 信息资产识别 三、评估说明 3.1无线网络安全检查项目评估 3.2无线网络与系统安全评估 3.3 ip管理与补丁管理 3.4防火墙 四、威胁细类分析 4.1威胁…

Ubuntu22.04系统安装Anaconda、CUDA和CUDNN

之前一直在Windows系统下使用Anaconda和CUDA加速&#xff0c;最近需要复现一个算法&#xff0c;文档里面有Linux系统conda构建环境的教程。 本篇博文参考博文&#xff0c;记录自己安装的过程&#xff0c;便于以后需要。 目录 1.Anaconda1.1 安装包下载1.2 安装软件1.3 更新cond…