【HarmonyOS開發】拖拽動畫的實現

動畫的原理是在一個時間段內,多次改變UI外觀,由于人眼會產生視覺暫留,所以最終看到的就是一個“連續”的動畫。UI的一次改變稱為一個動畫幀,對應一次屏幕刷新,而決定動畫流暢度的一個重要指標就是幀率FPS(Frame Per Second),即每秒的動畫幀數,幀率越高則動畫就會越流暢。
ArkUI中,產生動畫的方式是改變屬性值且指定動畫參數。動畫參數包含了如動畫時長、變化規律(即曲線)等參數。當屬性值發生變化后,按照動畫參數,從原來的狀態過渡到新的狀態,即形成一個動畫。

1、動畫分類

輸入圖片說明

2、常見動畫的使用

通過改變元素的寬高、位置、布局等觸發動畫
官方文檔-動畫

// 顯式動畫 https://developer.harmonyos.com/cn/docs/documentation/doc-references/ts-explicit-animation-0000001281480722
animateTo(value: AnimateParam, event: () => void): void
// 屬性動畫 https://developer.harmonyos.com/cn/docs/documentation/doc-references/ts-animatorproperty-0000001333321185 
animation(value: AnimateParam)
// 轉場動畫-必須和animateTo配合使用 https://developer.harmonyos.com/cn/docs/documentation/doc-references/ts-page-transition-animation-0000001281201178
transition(value: TransitionOptions)
transition({ type: TransitionType.All, scale: { x: 0, y: 0 } }) // 全部使用一種動畫
transition({ type: TransitionType.Insert, translate: { x: 200, y: -200 }, opacity: 0 }) // 進入/插入動畫
transition({ type: TransitionType.Delete, rotate: { x: 0, y: 0, z: 1, angle: 360 } }) // 移出/刪除動畫

3、矩陣動畫的使用

這一塊我們重點關注幾個常用的屬性

3.1 translate(拖拽動畫實現的主要屬性)

translate({x?: number, y?: number, z?: number}): Object

當x,y坐標為0時,則意味著,每個元素按照各自的位置進行排列(例如:grid、list、Stack等)。
因此,我們可以根據元素的下標index,通過一些算法來改變坐標的位置,從而實現拖拽動畫,具體見代碼

DOM的實現

// isStartDrag 為是否開始拖拽,當開始拖拽時,我們動態改變矩陣中元素的坐標
Grid() {ForEach(this.selected, (item: dataListType) => {GridItem() {Text(item.text).blockTextStyle(this.blockWidth)}.translate({x: this.isStartDrag ? this.geyCoodXY(index).x : 0,y: this.isStartDrag? this.geyCoodXY(index).y : 0}).animation({duration: DURATION, // 動畫時長curve: Curve.Linear, // 動畫曲線iterations: 1, // 播放次數playMode: PlayMode.Normal // 動畫模式})})
}
.columnsTemplate('1fr 1fr 1fr')
.columnsGap(16)
.rowsGap(16)
.editMode(true)  //設置Grid是否進入編輯模式,進入編輯模式可以拖拽Grid組件內部GridItem
.supportAnimation(true) // 開啟動畫

坐標改變的算法

  geyCoodXY(index) {const gridCol = this.getGridCol()let x = 0let y = 0if(this.insterIndex != -1) {if(index >= this.insterIndex) {// 判斷是否需要換行// 需要取余如果等于0,則需要換行,需要進行下移和左移if(parseInt(((index) % gridCol).toString()) === gridCol - 1) {// 判斷是否為當前列的最后一個if(this.options.type === 'object') {x = x - this.blockWidth * (gridCol - 1) - 16 * (gridCol - 2) - 19y = y + this.blockHeight - 16.5} else {x = x - this.blockWidth * (gridCol - 1) - 16 * (gridCol - 2) - 13y = y + this.blockHeight + 18}} else {// 默認右移x = x + 16 + this.blockWidth + 1}}if(!this.isStartDrag) {x = 0y = 0}}return {x: x,y: y}}/*** 獲取Grid高度計算是否需要+1*     場景1:當前數組(data)長度小于列(colNum)的長度*     場景2:當前數組的長度等于拖拽前的長度 && 對數組長度%列長度區域不為0* */getGridNum(data) {let len = data.lengthlet num = 0if(len < this.colNum) {num = 1}if(parseInt((len % this.colNum).toString()) !== 0 && this.editGridDataLength === len) {num = 1}return num}/*** 獲取當前布局列數* 默認:文本COL_TEXT:4* 默認:圖文COL_IMAGE_TEXT:3* */getGridCol() {return this.options.type === 'object' ? COL_IMAGE_TEXT : COL_TEXT}

3.2 scale

縮放函數,配合transform進行使用

scale({x?: number, y?: number, z?: number, centerX?: number, centerY?: number}): Object

3.3 rotate

旋轉函數

rotate({x?: number, y?: number, z?: number, angle?: number, centerX?: Length, centerY?: Length}): Object

3.4 transformPoint

坐標映射,可以將當前的變換效果作用到一個坐標點上。

源碼地址:MeshObjectEdit

輸入圖片說明

4、?注意點

4.1 Grid布局中的Item使用屬性動畫時,只能使用自帶的curve,無法自定義

4.2 底層渲染問題

?在開發拖拽動畫時,發現png的圖片在拖拽結束后,會出現圖片閃動的不流暢問題,改為svg圖片解決。因此通過大量的對比驗證,確認為鴻蒙底層竄然問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214098.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【帶頭學C++】----- 九、類和對象 ---- 9.12 C++之友元函數(9.12.1---12.4)

??????????????????????創做不易&#xff0c;麻煩點個關注???????????????????????? ??????????????????文末有驚喜&#xff01;獻舞一支&#xff01;???????????????????? 目錄 9.12…

TypeError: Cannot set properties of undefined (setting ‘xx‘)

在寫代碼中經常會遇到TypeError: Cannot set properties of undefined (setting ‘xx‘)&#xff0c;這個問題。 一般出現的場景&#xff1a;在調用接口訪問后端數據時&#xff0c;前端渲染顯示空白&#xff0c;并報此錯。例如&#xff0c;我在調用高德地圖&#xff0c;輸入經…

五:爬蟲-數據解析之xpath解析

三&#xff1a;數據解析之xpath解析 1.xpath介紹&#xff1a; ? xpath是XML路徑語言&#xff0c;它可以用來確定xml文檔中的元素位置&#xff0c;通過元素路徑來完成對元素的查找&#xff0c;HTML就是XML的一種實現方式&#xff0c;所以xpath是一種非常強大的定位方式? XPa…

vue2 element-ui select下拉框 選擇傳遞多個參數

<el-select v-model"select" slot"prepend" placeholder"請選擇" change"searchPostFn($event,123)"> <el-option :label"item.ziDianShuJu" :value"{value:item.id, label:item.ziDianShuJu}" v-for&qu…

Ubuntu系統使用快速入門實踐(七)——軟件安裝與使用(5)

Ubuntu系統使用快速入門實踐系列文章 下面是Ubuntu系統使用系列文章的總鏈接&#xff0c;本人發表這個系列的文章鏈接均收錄于此 Ubuntu系統使用快速入門實踐系列文章總鏈接 下面是專欄地址&#xff1a; Ubuntu系統使用快速入門實踐系列文章專欄 文章目錄 Ubuntu系統使用快速…

crypto-js加密、解密與node Crypto加解密模塊的應用

前端用crypto-js實現加解密&#xff0c;node端用Crypto模塊&#xff0c;兩者想要相同結果的話&#xff0c;就要保持加密密鑰和加密算法一致。 crypto-js加密、解密 參考&#xff1a; 『crypto-js 加密和解密』 前端使用CryptoJS加密解密 // DES算法 import CryptoJS from cryp…

【unity】【WebRTC】從0開始創建一個Unity遠程媒體流app-構建可同步場景

【背景】 最近在研究遠程畫面&#xff0c;所以就實踐了一下。技術采用我認為比較合適的WebRTC。 這篇文章的基礎是我的另一篇博文&#xff0c;如果希望順利完成本篇操作&#xff0c;請先關注我后查詢我的如下博文&#xff1a; 【WebRTC】【Unity】Unity Web RTC1-Unity中簡單實…

Docker架構及常用的命令

一、初識Docker 1、 docker是一個快速交付應用、運行應用的技術&#xff0c;具備下列優勢&#xff1a; 可以將程序及其依賴、運行環境一起打包為一個鏡像&#xff0c;可以遷移到任意Linux操作系統運行時利用沙箱機制形成隔離容器&#xff0c;各個應用互不干擾啟動、移除都可以…

邊緣智能網關如何應對環境污染難題

隨著我國工業化、城鎮化的深入推進&#xff0c;包括大氣污染在內的環境污染防治壓力繼續加大。為應對環境污染防治難題&#xff0c;佰馬綜合邊緣計算、物聯網、智能感知等技術&#xff0c;基于邊緣智能網關打造環境污染實時監測、預警及智能干預方案&#xff0c;可應用于大氣保…

銀行數據分析入門篇:信用卡全生命周期分析,到底應該怎么做?

最近有朋友向我咨詢銀行信貸業務的數據分析&#xff0c;就看了很多案例&#xff0c;剛好看到一個信用卡全生命周期分析的案例&#xff0c;做得很詳細又通俗易懂&#xff0c;基本上可以直接復制套用&#xff0c;所以特地分享給大家。 本文主要分享作者整個分析作品的思路&#x…

Unity對象池

標題&#xff1a;Unity對象池技術詳解 一、引言 在Unity游戲開發中&#xff0c;我們經常需要創建大量的游戲對象&#xff0c;如子彈、敵人和道具等。然而&#xff0c;頻繁地創建和銷毀這些對象會消耗大量的系統資源&#xff0c;影響游戲的性能。為了解決這個問題&#xff0c;…

golang 使用 viper 加載配置文件 自動反序列化到結構

golang使用 viper 無需設置 mapstructure tag 根據配置文件后綴 自動返序列化到結構 解決結構有下劃線的字段解析不成功問題 viper 正常加載配置文件 golang viper 其中可以用來 查找、加載和反序列化JSON、TOML、YAML、HCL、INI、envfile和格式的配置文件 配置文件 test_to…

jdom利用純java技術對xml文檔進行解析、生成、序列化等各種操作

Jdom對xml文檔進行解析、生成、序列化等各種操作。 使用jdom之前&#xff0c;首先要導入jar包&#xff1a;jdom.jar 獲得根元素&#xff1a; //首先確定xml文件位置 String xmlPath "./src/ceshi/Test.xml"; //使用的解析器&#xff0c;這里表示默認的解…

KMP算法數組下標從0和數組下標從1開始

我在運用KMP時&#xff0c;總時會搞混如果數組下標為0時要如何用寫&#xff0c;下標為1時要如何寫。 當下標為0時kmp void kmp(int len) {//下標為0 時vector<int> f(n,-1);for(int i 1;i < len;i){ // 每次更新的是 下標i // 當第 i1不匹配是 跳到 f[i]的位置上&…

106.進程控制(結束、孤兒、僵尸進程)以及進程回收

目錄 結束進程 孤兒進程 僵尸進程 進程回收 wait() waitpid 進程控制是指在操作系統中對進程進行創建、終止、掛起、喚醒以及進程之間的同步、通信等操作的管理。 結束進程 exit() 和 _exit() 函數都用于終止一個進程&#xff0c;但它們之間有一些重要的區別&#xf…

新工科:數據科學與大數據技術實驗中心解決方案,賦能高校新工科數智人才培養

隨著數字經濟蓬勃發展&#xff0c;數字化產業和產業數字化成為就業增長新動能。據人瑞人才與德勤調研顯示&#xff0c;未來3年&#xff0c;數字產業化企業最需要運營人員和開發人員&#xff08;包括大數據開發工程師、數據建模開發工程師等&#xff09;&#xff0c;其次是數據分…

【RTOS學習】FreeRTOS中的鏈表 | 堆的管理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;專欄&#xff1a;《RTOS學習》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交給時間&#xff01; 目錄 &#x1f969;FreeRTOS中的鏈表&#x1f95e;初始化&#x1f95e;尾部插入&#x1f95e;按順…

OpenWRT搭建本地web站點并結合內網穿透實現公網遠程訪問

文章目錄 前言1. 檢查uhttpd安裝2. 部署web站點3. 安裝cpolar內網穿透4. 配置遠程訪問地址5. 配置固定遠程地址 前言 uhttpd 是 OpenWrt/LuCI 開發者從零開始編寫的 Web 服務器&#xff0c;目的是成為優秀穩定的、適合嵌入式設備的輕量級任務的 HTTP 服務器&#xff0c;并且和…

【Windows】MCSM面板搭建Mycraft服務器,實現公網遠程聯機

文章目錄 前言1.Mcsmanager安裝2.創建Minecraft服務器3.本地測試聯機4. 內網穿透4.1 安裝cpolar內網穿透4.2 創建隧道映射內網端口 5.遠程聯機測試6. 配置固定遠程聯機端口地址6.1 保留一個固定TCP地址6.2 配置固定TCP地址 7. 使用固定公網地址遠程聯機 前言 MCSManager是一個…

[香橙派]Orange pi zero 3命令行配網方法——建立ssh連接——Ubuntu配置WIFI自動連接

一、前言 前面我們給Orange Pi安裝了Ubuntu系統&#xff0c;并通過MobaXterm進行了串口連接&#xff0c;但其實并不方便&#xff0c;在日常開發中&#xff0c;我們希望能夠使用更方便的ssh連接來進行操作&#xff0c;因此配置網絡是必要的。 本章介紹的方法無需網線、HDMI線等&…