HarmonyOS Next 屬性動畫和轉場動畫

HarmonyOS Next 屬性動畫和轉場動畫

在鴻蒙應用開發中,動畫是提升用戶體驗的關鍵要素。通過巧妙運用動畫,我們能讓應用界面更加生動、交互更加流暢,從而吸引用戶的注意力并增強其使用粘性。鴻蒙系統為開發者提供了豐富且強大的動畫開發能力,其中屬性動畫是整個動畫體系的核心基礎。接下來,讓我們深入探索鴻蒙動畫。

鴻蒙動畫體系概覽

鴻蒙動畫體系旨在為開發者打造全方位、多層次的動畫創作環境。它不僅包含屬性動畫這種能夠精確控制組件屬性變化的基礎類型,還擁有轉場動畫,用于實現界面間的平滑過渡,為用戶帶來自然且流暢的視覺切換體驗。無論是組件的移動、旋轉、縮放,還是界面的淡入淡出、滑動切換,鴻蒙動畫體系都能輕松應對,助力開發者創建出極具吸引力的應用界面。

屬性動畫

可動畫屬性的多樣選擇

系統預定義可動畫屬性:鴻蒙系統貼心地為組件提供了一系列內置的可動畫屬性接口。例如,position屬性能夠精準地調整組件在屏幕上的位置,使組件可以在不同坐標間平滑移動;scale屬性用于控制組件的縮放比例,讓組件能夠自如地放大或縮小;opacity屬性則決定了組件的透明度,實現淡入淡出等效果;blur屬性可賦予組件模糊效果,為界面增添獨特的視覺風格。這些系統預定義的可動畫屬性,極大地簡化了開發者創建常見動畫效果的過程。

分類說明
布局屬性位置、大小、內邊距、外邊距、對齊方式、權重等。
仿射變換平移、旋轉、縮放、錨點等。
背景背景顏色、背景模糊等。
內容文字大小、文字顏色,圖片對齊方式、模糊等。
前景前景顏色等。
OverlayOverlay屬性等。
外觀透明度、圓角、邊框、陰影等。

自定義可動畫屬性拓展:ArkUI 賦予開發者強大的自定義能力,通過@AnimatableExtend裝飾器,開發者能夠從自定義繪制的內容中抽象出可動畫屬性。設想在開發一個音樂應用時,需要自定義繪制一個音量圖標,并且希望該圖標能夠根據音量大小動態改變其大小、顏色或形狀。借助@AnimatableExtend裝飾器,開發者就可以為這個原本不具備默認動畫屬性的自定義圖標添加動畫效果,從而滿足特定的業務需求和創意設計。

豐富的屬性動畫接口

animateTo 接口:該接口主要作用于閉包內改變屬性引起的界面變化,尤其在組件出現和消失的轉場場景中表現出色。其原理是通過對比閉包前界面和閉包中狀態變量引起的界面之間的差異,然后依據設定的動畫參數對這些差異進行動畫處理。它支持多次調用以及嵌套使用,這為開發者在處理復雜動畫邏輯時提供了極大的靈活性。例如,在一個需要讓組件同時進行平移、旋轉和縮放,并且這些動畫都使用相同動畫參數的場景中,animateTo就能發揮其優勢,簡潔高效地實現所需動畫效果。

animation 接口animation接口作用于組件通過屬性接口綁定的屬性變化引起的界面變化。它能夠敏銳地識別組件的可動畫屬性變化,當檢測到綁定的可動畫屬性發生改變時,會自動為這些屬性變化添加動畫效果。值得注意的是,組件的接口調用遵循從下往上的執行順序,animation只會作用于在其之上的屬性調用。這意味著開發者可以根據組件屬性的調用順序,輕松地對多個屬性設置不同的animation效果。比如,在一個組件既要移動又要改變透明度,且移動速度和透明度變化速度不同的場景中,通過animation接口分別為translate屬性和opacity屬性設置不同的動畫參數,就能精準實現所需的動畫效果。

代碼示例

下面通過一個具體的代碼示例,展示如何使用animateTo接口來實現屬性動畫。

@Entry
@Component
@Preview
struct AnimPage {@State animate: boolean = false;// 第一步: 聲明相關狀態變量@State rotateValue: number = 0; // 組件一旋轉角度@State translateX: number = 0; // 組件二偏移量@State opacityValue: number = 1; // 組件二透明度build() {Column({ space: 20 }) {Row() {// 組件一Column() {Text("123")}.rotate({ angle: this.rotateValue }).backgroundColor('#317AF7').justifyContent(FlexAlign.Center).width(100).height(100).borderRadius(30).onClick(() => {this.getUIContext()?.animateTo({ curve: curves.springMotion(), duration: 3500 }, () => {this.animate = !this.animate;// 第三步:閉包內通過狀態變量改變UI界面// 這里可以寫任何能改變UI的邏輯比如數組添加,顯隱控制,系統會檢測改變后的UI界面與之前的UI界面的差異,對有差異的部分添加動畫// 組件一的rotate屬性發生變化,所以會給組件一添加rotate旋轉動畫this.rotateValue = this.animate ? 90 : 0;// 組件二的透明度發生變化,所以會給組件二添加透明度的動畫this.opacityValue = this.animate ? 0.6 : 1;// 組件二的translate屬性發生變化,所以會給組件二添加translate偏移動畫this.translateX = this.animate ? 50 : 0;})})// 組件二Column() {Text("456")}.justifyContent(FlexAlign.Center).width(100).height(100).backgroundColor('#D94838').borderRadius(30).opacity(this.opacityValue).translate({ x: this.translateX }).animation({ curve: curves.springMotion(), duration: 3500 })}.width('100%').justifyContent(FlexAlign.Center)}}
}

在上述代碼中,當用戶點擊Column組件時,animate狀態變量會發生改變。依據animate的值,rotateValue(旋轉角度)、translateX(偏移量)和opacityValue(透明度)這三個狀態變量會相應地改變。由于opacityrotate等屬性綁定了animation接口,并且設置了彈簧曲線curves.springMotion(),所以當這些屬性值發生變化時,會自動按照彈簧曲線的規律產生動畫效果,使組件的旋轉、平移和透明度變化呈現出自然的彈簧效果,為用戶帶來獨特而生動的視覺體驗。
效果如下:
請添加圖片描述

轉場動畫

轉場動畫是指對將要出現或消失的組件做動畫,對始終出現的組件做動畫應使用屬性動畫。轉場動畫主要為了讓開發者從繁重的消失節點管理中解放出來,如果用屬性動畫做組件轉場,開發者需要在動畫結束回調中刪除組件節點。同時,由于動畫結束前已經刪除的組件節點可能會重新出現,還需要在結束回調中增加對節點狀態的判斷。

轉場效果說明動畫
IDENTITY禁用轉場效果。無。
OPACITY默認的轉場效果,透明度轉場。出現時透明度從0到1,消失時透明度從1到0。
SLIDE滑動轉場效果。出現時從窗口左側滑入,消失時從窗口右側滑出。
translate通過設置組件平移創建轉場效果。出現時為translate接口設置的值到默認值0,消失時為默認值0到translate接口設置的值。
rotate通過設置組件旋轉創建轉場效果。出現時為rotate接口設置的值到默認值0,消失時為默認值0到rotate接口設置的值。
opacity通過設置透明度參數創建轉場效果。出現時為opacity設置的值到默認透明度1,消失時為默認透明度1到opacity設置的值。
move通過TransitionEdge創建從窗口哪條邊緣出來的效果。出現時從TransitionEdge方向滑入,消失時滑出到TransitionEdge方向。
asymmetric通過此方法組合非對稱的出現消失轉場效果。
- appear:出現轉場的效果。
- disappear:消失轉場的效果。
出現時采用appear設置的TransitionEffect出現效果,消失時采用disappear設置的TransitionEffect消失效果。
combine組合其他TransitionEffect。組合其他TransitionEffect,一起生效。
animation定義轉場效果的動畫參數:
- 如果不定義會跟隨animateTo的動畫參數。
- 不支持通過控件的animation接口配置動畫參數。
- TransitionEffect中animation的onFinish不生效。
調用順序時從上往下,上面TransitionEffect的animation也會作用到下面TransitionEffect。

代碼示例

@Entry
@Component
@Preview
struct AnimPage {@State buttonScale: number = 1;@State buttonWidth: number = 100;@State showNewBtn: boolean = true// 創建默認透明度轉場效果,并指定了springMotion(0.6, 0.8)曲線private opacityEffect: TransitionEffect = TransitionEffect.OPACITY.animation({ curve: curves.springMotion(0.6, 0.8) })// 創建默認平移轉場效果, 左進右出private slideEffect: TransitionEffect = TransitionEffect.SLIDE.animation({ curve: curves.springMotion(0.6, 0.8) })private customEffect: TransitionEffect =// 創建默認透明度轉場效果,并指定了springMotion(0.6, 0.8)曲線TransitionEffect.OPACITY.animation({ curve: curves.springMotion(0.6, 0.8) })// 通過combine方法,這里的動畫參數會跟隨上面的TransitionEffect,也就是springMotion(0.6, 0.8).combine(TransitionEffect.scale({ x: 0, y: 0 }))// 添加旋轉轉場效果,這里的動畫參數會跟隨上面帶animation的TransitionEffect,也就是springMotion(0.6, 0.8).combine(TransitionEffect.rotate({ angle: 90 }))// 添加平移轉場效果,這里的動畫參數使用指定的springMotion().combine(TransitionEffect.translate({ y: 150 }).animation({ curve: curves.springMotion() }))// 添加move轉場效果,這里的動畫參數會跟隨上面的TransitionEffect,也就是springMotion().combine(TransitionEffect.move(TransitionEdge.END))build() {Column({ space: 20 }) {Button("開始動畫").onClick(() => {this.buttonScale = 1.5 / this.buttonScalethis.buttonWidth = 300 - this.buttonWidththis.showNewBtn = !this.showNewBtn}).width(this.buttonWidth).scale({ x: this.buttonScale, y: this.buttonScale }).animation({ curve: curves.springMotion() })if (this.showNewBtn) {Button("透明顯隱(默認)").transition(this.opacityEffect)}if (this.showNewBtn) {Button("左進右出").transition(this.slideEffect)}if (this.showNewBtn) {Button("自定義").transition(this.customEffect)}}.width('100%')}
}

這段代碼實現了一個包含按鈕動畫效果的界面。主要功能如下:
定義了按鈕的縮放、寬度和顯示狀態。
創建了三種動畫效果:透明度轉場、平移轉場和自定義組合轉場。
點擊“開始動畫”按鈕時,切換按鈕的縮放和寬度,并切換新按鈕的顯示狀態。
根據顯示狀態,動態展示三個帶有不同動畫效果的按鈕。
運行效果:
file

通過以上對鴻蒙動畫體系的介紹,特別是對屬性動畫和轉場動畫代碼示例的實操,相信開發者們對鴻蒙動畫開發有了更清晰的認識和更深入的理解。在實際開發中,充分利用這些動畫特性,將為鴻蒙應用增添無限魅力,提升用戶體驗到新的高度。

#ArkTS UI

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

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

相關文章

PHP:phpstudy無法啟動MySQL服務問題解決

文章目錄 一、問題說明二、解決問題 一、問題說明 我的Windows10系統,之前安裝過MySQL5.7的版本。 然后,用phpstudy安裝MySQL8,并啟動MySQL8。 發生無法啟動的情況。 二、解決問題 1、刪除本地MySQL7的服務 net stop MySQL //這里的服務名…

Nginx(基礎安裝+配置文件)

目錄 一.Nginx基礎 1.基礎知識點 2.異步非阻塞機制 二.Nginx安裝 2.1安裝nginx3種方式 1.包管理工具安裝(yum/apt) 2.本地包安裝(rpm/dpkg) 3.源碼編譯安裝 3.1 源碼編譯安裝nginx流程(ubuntu) 1.…

C++ Windows下屏幕截圖

屏幕截圖核心代碼(如果要求高幀率,請使用DxGI): // RGB到YUV的轉換公式 #define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) (0.587 * (g)) (0.114 * (b)))) #define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) …

修改jupyter notebook的工作空間

今天,我之前R配置jupyter工作空間,講了各種語言內核分配不同的工作空間,雖然是方便管理,但有個問題就是需要每次都進入C盤的配置文件找到notebook的工作空間設置路徑打開修改嘛。 因此,今天我編寫了一個python腳本&am…

江科大51單片機筆記【9】DS1302時鐘可調時鐘(下)

在寫代碼前,記得把上一節的跳線帽給插回去,不然LCD無法顯示 一.DS1302時鐘 1.編寫DS1302.c文件 (1)重新對端口定義名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;(2)初始化 因為…

電商行業門店管理軟件架構設計與數據可視化實踐

一、行業痛點與核心訴求 在電商多平臺運營成為主流的背景下,企業普遍面臨三大管理難題: ?數據碎片化:某頭部服飾品牌2023年運營報告顯示,其分布在8個平臺的162家門店,日均產生23萬條訂單數據,但財務部門需要5個工作日才能完成跨平臺利潤核算。?成本核算失真:行業調研…

創新算法!BKA-Transformer-BiLSTM黑翅鳶優化算法多變量時間序列預測

創新算法!BKA-Transformer-BiLSTM黑翅鳶優化算法多變量時間序列預測 目錄 創新算法!BKA-Transformer-BiLSTM黑翅鳶優化算法多變量時間序列預測預測效果基本介紹BKA-Transformer-BiLSTM黑翅鳶優化算法多變量時間序列預測一、引言1.1、研究背景和意義1.2、…

leetcode 95.不同的二叉搜索樹 Ⅱ

首先分析一下什么是二叉搜索樹。因為我本科學習數據結構的時候就是單純背了一下題庫,考試非常簡單。現在額外補充學一些之前自己沒有學過的內容。有序向量可以二分查找,列表可以快速插入和刪除。二叉搜索樹可以實現按照關鍵碼訪問。call by key .數據表現…

數據安全防線:備份文件的重要性與自動化實踐

在數字化時代,信息已成為企業運營和個人生活的核心資源。無論是企業的核心數據、客戶的敏感信息,還是個人的珍貴照片、重要文檔,這些數據一旦丟失或受損,都可能帶來不可估量的損失。因此,備份文件的重要性不言而喻&…

碰一碰發視頻系統之寫卡功能開發了,支持OEM

一、引言 在碰一碰發視頻系統中,NFC(Near Field Communication,近場通信)技術扮演著關鍵角色。其中,寫卡功能是實現用戶與系統便捷交互的重要環節,通過將特定的視頻相關信息寫入 NFC 標簽,用戶…

【數據結構初階第十八節】八大排序系列(上篇)—[詳細動態圖解+代碼解析]

看似不起眼的日復一日,總會在某一天讓你看到堅持的意義。??????云邊有個稻草人-CSDN博客 hello,好久不見! 目錄 一. 排序的概念及運用 1. 概念 2. 運用 3. 常見排序算法 二. 實現常見排序算法 1. 插入排序 (1&…

python爬蟲系列課程8:js瀏覽器window對象屬性

python爬蟲系列課程8:js瀏覽器window對象屬性 一、JavaScript的組成二、document常見屬性對象三、navigator對象一、JavaScript的組成 JavaScript可以分為三個部分:ECMAScript標準、DOM、BOM。 ECMAScript標準:即JS的基本語法,JavaScript的核心,描述了語言的基本語法和數…

快速使用PPASR V3版不能語音識別框架

前言 本文章主要介紹如何快速使用PPASR語音識別框架訓練和推理,本文將致力于最簡單的方式去介紹使用,如果使用更進階功能,還需要從源碼去看文檔。僅需三行代碼即可實現訓練和推理。 源碼地址:https://github.com/yeyupiaoling/P…

cannon g3810打印機設置

現在AI這么厲害,是不是很少人來這里搜索資料了。 不過我還是寫一下。 買了一臺cannon g3810打印機。一直都用USB打印,今天突然想用手機打印。于是又折騰了兩個小時,終于折騰完了。 步驟如下: [1]打開官網,下載佳能…

使用 Arduino 和 ThingSpeak 通過 Internet 進行心跳監測

使用 Arduino 和 ThingSpeak 通過 Internet 進行心跳監測 在這個項目中,我們將使用 Arduino 制作一個心跳檢測和監測系統,該系統將使用脈搏傳感器檢測心跳,并在與其連接的 LCD 上顯示 BPM(每分鐘心跳次數)讀數。它還將使用 Wi-Fi 模塊ESP8266將讀數發送到 ThingSpeak 服務…

vulnhub靶場之【digitalworld.local系列】的snakeoil靶機

前言 靶機:digitalworld.local-snakeoil,IP地址為192.168.10.11 攻擊:kali,IP地址為192.168.10.6 kali采用VMware虛擬機,靶機選擇使用VMware打開文件,都選擇橋接網絡 這里官方給的有兩種方式&#xff0…

自行車的主要品牌

一、國際知名品牌(專注運動與高端市場) 捷安特(GIANT) 臺灣品牌,全球最大自行車制造商之一,覆蓋山地車、公路車、通勤車等多品類。 美利達(MERIDA) 臺灣品牌,以山地車…

C語言(隊列)

1、隊列的原理和作用 1、1 隊列的原理 隊列的原理其實就像一個管道,如果我們不斷的往管道里塞乒乓球,每個乒乓球在管道里就會排列一條隊列,先進去的乒乓球會先出來,這個就是隊列先進先出的規則 球從左邊進去的動作叫入列&#xf…

【C++算法】AVL樹的平衡之美:從理論到C++高效實現

AVL樹是一種自平衡二叉搜索樹,解決了普通二叉搜索樹在數據傾斜時的性能退化問題。本文深入探討了AVL樹的理論基礎,包括平衡因子的定義、旋轉操作的數學推導,并通過LaTeX公式分析其時間復雜度。接著,我們用C++實現了一個完整的AVL樹,包括插入、刪除和平衡調整的詳細代碼,附…

黑金風格人像靜物戶外旅拍Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程 針對人像、靜物以及戶外旅拍照片,運用 Lightroom 軟件進行風格化調色工作。旨在通過軟件中的多種工具,如基本參數調整、HSL(色相、飽和度、明亮度)調整、曲線工具等改變照片原本的色彩、明度、對比度等屬性,將…