75.HarmonyOS NEXT ImageItemView组件深度剖析:手势交互与动画实现(二)

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

HarmonyOS NEXT ImageItemView组件深度剖析:手势交互与动画实现(二)

一、手势系统架构
.gesture(GestureGroup(GestureMode.Exclusive, // 手势互斥模式TapGesture({ count: 2 }), // 双击TapGesture({ count: 1 }), // 单击PinchGesture({ fingers: 2 }), // 双指捏合PanGesture({ fingers: 1 }) // 单指滑动)
)
  • GestureGroup:手势组合容器,管理多个手势的相互关系
  • GestureMode.Exclusive:互斥模式,同一时刻只有一个手势生效
  • 优先级顺序:后声明的手势优先级更高(这里双击手势优先于单击)
二、双击缩放实现
TapGesture({ count: 2 }).onAction(() => {if (this.imageScaleInfo.scaleValue > 默认值) {// 缩小逻辑fn = () => {this.isEnableSwipe = true; // 启用滑动切换this.imageScaleInfo.reset(); // 重置缩放this.matrix = matrix4.identity(); // 重置变换矩阵};} else {// 放大逻辑fn = () => {this.isEnableSwipe = false; // 禁用滑动切换const ratio = this.calcFitScaleRatio(...); // 计算适配比例this.matrix = matrix4.identity().scale({x: ratio, y: ratio});};}runWithAnimation(fn); // 带动画执行})
  • 状态切换逻辑
    • 当前已放大 → 双击恢复默认
    • 当前默认状态 → 双击放大至屏幕适配尺寸
  • 关键方法
    • calcFitScaleRatio:计算填满屏幕所需比例
    • runWithAnimation:HarmonyOS动画API,实现平滑过渡
三、捏合缩放实现
PinchGesture({ fingers: 2 }).onActionUpdate((event) => {// 实时计算缩放比例this.imageScaleInfo.scaleValue = 上次值 * event.scale;// 边界限制const maxScale = 最大缩放值 * 1.3; // 允许超出20%的弹性效果const minScale = 默认值 * 0.7; // 允许缩小到70%this.imageScaleInfo.scaleValue = Math.min(maxScale, Math.max(minScale, this.imageScaleInfo.scaleValue));// 应用矩阵变换this.matrix = matrix4.identity().scale({x: 当前比例,y: 当前比例});}).onActionEnd(() => {// 弹性回弹处理if (当前比例 < 默认值) {runWithAnimation(() => 重置到默认值);} else if (当前比例 > 最大缩放值) {runWithAnimation(() => 调整到最大值);}})
  • 核心参数
    • event.scale:捏合手势的实时缩放系数(>1放大,<1缩小)
    • lastValue:记录上次缩放值,保证连续性
  • 边界处理技巧
    • 允许超出最大/最小值一定比例(提升操作手感)
    • 手势结束后执行弹性动画
四、滑动位移实现
PanGesture({ fingers: 1 }).onActionUpdate((event) => {if (当前是默认缩放比例) return; // 默认状态禁止滑动// 计算新偏移量this.imageOffsetInfo.currentX = 上次X + event.offsetX;this.imageOffsetInfo.currentY = 上次Y + event.offsetY;}).onActionEnd(() => {// 保存当前偏移量this.imageOffsetInfo.stash();})
  • 位移条件
    • 仅在放大状态下允许滑动
    • 默认状态下的滑动留给父组件处理(用于图片切换)
  • 坐标计算
    • offsetX/Y:手势相对于起点的位移量
    • 需要叠加上次的偏移量实现连续移动
五、动画系统应用
runWithAnimation(() => {// 状态变更操作this.imageScaleInfo.scaleValue = 目标值;this.matrix = 新矩阵;
});
  • 动画原理
    • 包裹在runWithAnimation中的状态变更会自动应用动画
    • 系统默认使用弹性动画(spring)效果
  • 自定义动画
    runWithAnimation(() => {// 操作
    }, {duration: 300, // 动画时长curve: Curve.EaseInOut // 缓动曲线
    })
    
六、矩阵变换原理
matrix4.identity() // 创建单位矩阵.scale({ x: 2, y: 2 }) // 缩放变换.translate({ x: 100, y: 50 }) // 位移变换.copy(); // 创建新实例
  • 矩阵操作顺序
    • 先缩放后位移(矩阵乘法顺序,实际是反向应用)
    • 建议先执行缩放再执行位移
  • 坐标系特点
    • 以组件中心点为变换原点
    • 位移量基于缩放后的坐标系

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

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

相关文章

Qt 控件概述 QWdiget

Qt为我们提供了很多控件&#xff0c;这些控件拿过来就可以使用 目录 QWidget 属性 WindowFrame的影响 QWidget Qt中所有的组件都是继承自QWidget Qt Creator中的右侧可以看到QWidget的各种属性 其中各种属性都可以在Qt文档中找到说明 ​ 属性 enabled&#xff1a;描述该组…

适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;适合企业内训的 AI 工具实操培训教程 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术迅速发展&#xff0c;深度融入到各个领域&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;更是成…

Axios 请求取消:从原理到实践

Axios 请求取消&#xff1a;从原理到实践 在现代前端开发中&#xff0c;网络请求是不可或缺的一部分。Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;广泛应用于浏览器和 Node.js 环境中。然而&#xff0c;在某些场景下&#xff0c;我们可能需要取消正在进行的请求&…

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息&#xff0c;您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南&#xff0c;帮助您完成这一过程&#xff1a; 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户&#xff08;如果您还没有的话&#xff09;。在Twi…

【最后203篇系列】015 几种消息队列的思考

背景 队列还是非常重要的中间件&#xff0c;可以帮助我们&#xff1a;提高处理效率、完成更复杂的处理流程 最初&#xff0c;我觉得只要掌握一种消息队列就够了&#xff0c;现在想想挺好笑的。 过去的探索 因为我用python&#xff0c;而rabbitmq比较贴合快速和复杂的数据处…

TensorFlow 与 TensorFlow Lite:核心解析与层应用

1. 引言 TensorFlow 是 Google 开发的开源机器学习框架&#xff0c;支持从数据预处理、模型训练到推理部署的完整生命周期。然而&#xff0c;在嵌入式和移动设备上&#xff0c;原生 TensorFlow 过于庞大&#xff0c;因此 Google 推出了轻量级版本——TensorFlow Lite&#xff…

DeepSeek大模型在政务服务领域的应用

DeepSeek大模型作为国产人工智能技术的代表&#xff0c;近年来在政务服务领域的应用呈现多点开花的态势。通过多地实践&#xff0c;该技术不仅显著提升了政务服务的效率与智能化水平&#xff0c;还推动了政府治理模式的创新。以下从技术应用场景、典型案例及发展趋势三个维度进…

电子电气架构 --- 分布到集中的动カ系统及基于域控制器的架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

深入理解C/C++堆数据结构:从原理到实战

一、堆的本质与特性 1.1 什么是堆数据结构&#xff1f; 堆&#xff08;Heap&#xff09;是一种特殊的完全二叉树&#xff0c;它满足以下核心性质&#xff1a; 堆序性&#xff1a;每个节点的值都满足特定顺序关系 结构性&#xff1a;完全二叉树的结构特性&#xff08;除最后一…

Python学习第十七天

Django框架-SQLite3 介绍 Django内置了对 SQLite3 数据库的支持。SQLite3 是一个轻量级的嵌入式数据库引擎&#xff0c;非常适合开发、测试和小型项目。以下是关于 Django 中 SQLite3 的介绍和应用指南。&#xff08;除了这些还支持mysql、oracle以及其他查询文档&#xff0c;…

Docker 》》Docker Compose 》》network 网络 compose

docker 默认的网络 三种模式 # 列出所有当前主机上或Swarm集群上的网络 docker network ls#查看网络详情 docker network inspect network名称# 清除未使用的docker网络 docker network prune -f# 创建网络 ocker network create -d bridge 网络名称 docker network create –s…

Python数字信号处理之最佳等波纹滤波器阶数估计原理

Matlab中的阶数估计函数 在MATLAB中&#xff0c;使用firpmord函数可以估算等波纹FIR滤波器的最小阶数。该方法基于Parks-McClellan算法&#xff0c;通过通带和阻带的频率边界、幅度响应及允许的最大误差来自动计算参数。 rp 3; % Passband ripple in dB rs 40; …

JumpServer基础功能介绍演示

堡垒机可以让运维人员通过统一的平台对设备进行维护&#xff0c;集中的进行权限的管理&#xff0c;同时也会对每个操作进行记录&#xff0c;方便后期的溯源和审查&#xff0c;JumpServer是由飞致云推出的开源堡垒机&#xff0c;通过简单的安装配置即可投入使用&#xff0c;本文…

C++和C的区别

C和C语言虽然共享相似的语法&#xff0c;但在设计理念和功能特性上有显著区别。以下是两者的主要差异&#xff1a; 1. 编程范式 C&#xff1a;纯过程式编程&#xff0c;强调函数和步骤。C&#xff1a;支持多范式&#xff0c;包括面向对象编程&#xff08;类、继承、多态&…

Android LeakCanary 使用 · 原理详解

一、简介 LeakCanary 是 Square 公司开源的 Android 内存泄漏检测工具&#xff0c;通过自动化监控和堆转储分析&#xff0c;帮助开发者快速定位内存泄漏根源。其核心设计轻量高效&#xff0c;已成为 Android 开发中必备的调试工具。 二、使用方式 1. 集成步骤 在项目的 buil…

每日一题---dd爱框框(Java中输入数据过多)

dd爱框框 实例&#xff1a; 输入&#xff1a; 10 20 1 1 6 10 9 3 3 5 3 7 输出&#xff1a; 3 5 这道题要解决Java中输入的数过多时&#xff0c;时间不足的的问题。 应用这个输入模板即可解决&#xff1a; Java中输入大量数据 import java.util.*; import java.io.*;pu…

redis部署架构

一、redis多实例部署 实例1 安装目录&#xff1a;/app/6380 数据目录&#xff1a;/app/6380/data 实例2 安装目录&#xff1a;/app/6381 数据目录&#xff1a;/app/6381/data 1、创建实例安装目录 2、拷贝实例的配置文件 3、编辑实例的配置文件 第…

vscode python相对路径的问题

vscode python相对路径的问题 最近使用使用vscode连接wsl2写python时&#xff0c;经常遇到找不到包中的方法的问题&#xff0c;最终发现vscode在执行python代码时目录不是从当前python文件开始算起&#xff0c;而是从当前工作区的目录开始算起&#xff0c;比如说我打开的是/ho…

面试vue2开发时怎么加载编译速度(webpack)

可以输入命令获取默认 webpack 设置 vue inspect > set.js 1.使用缓存 configureWebpack: {cache: {type: filesystem, // 使用文件系统缓存类型buildDependencies: {config: [__filename] // 缓存依赖&#xff0c;例如webpack配置文件路径}}}, 2.启用 vue-loader (测试明…

uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)

文章目录 **主要功能**1. **快速安装和管理 Python 包**2. **生成和管理锁文件 (requirements.lock)**3. **创建虚拟环境**4. **与 poetry 兼容** **核心优势**1. **极快的速度**&#xff1a;基于 Rust 实现&#xff0c;利用多线程和缓存大幅加速依赖解析。2. **轻量且独立**&a…