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.pswp.cn/web/72358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72358.shtml
英文地址,請注明出處:http://en.pswp.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…