鴻蒙NEXT開發動畫案例4

?1.創建空白項目


2.Page文件夾下面新建Spin.ets文件,代碼如下:

/*** TODO SpinKit動畫組件 - 雙粒子旋轉縮放動畫* author: CSDN-鴻蒙布道師* since: 2025/05/08*/
@ComponentV2
export struct SpinFour {// 參數定義@Require @Param spinSize: number = 36;@Require @Param spinColor: ResourceColor = '#209ED8';// 局部狀態@Local x1: number = 0;@Local y1: number = 0;@Local scale1: number = 1;@Local angle1: number = 0;@Local x2: number = this.spinSize * 0.65;@Local y2: number = this.spinSize * 0.65;@Local scale2: number = 1;@Local angle2: number = 0;aboutToAppear(): void {this.x2 = this.spinSize * 0.65;this.y2 = this.spinSize * 0.65;}build() {RelativeContainer() {Canvas().chunkStyle().translate({ x: this.x1, y: this.y1 }).scale({ x: this.scale1, y: this.scale1 }).rotate({ angle: this.angle1 })Canvas().chunkStyle().translate({ x: this.x2, y: this.y2 }).scale({ x: this.scale2, y: this.scale2 }).rotate({ angle: this.angle2 })}.width(this.spinSize).height(this.spinSize).onAppear(() => {this.startAnimation();});}/*** 啟動無限循環的關鍵幀動畫*/private startAnimation(): void {const uiContext = this.getUIContext();if (!uiContext) return;const keyframes1 = this.createKeyframes(1);const keyframes2 = this.createKeyframes(2);uiContext.keyframeAnimateTo({ iterations: -1, delay: 0 }, keyframes1);uiContext.keyframeAnimateTo({ iterations: -1, delay: 0 }, keyframes2);}/*** 根據粒子編號創建對應的關鍵幀動畫* @param particleIndex 粒子索引(1 或 2)*/private createKeyframes(particleIndex: 1 | 2): Array<KeyframeState> {const updatePositionAndScale = (step: number): void => {if (particleIndex === 1) {switch (step) {case 1:this.scale1 = 0.5;this.angle1 = -90;this.x1 = this.spinSize * 0.65;break;case 2:this.scale1 = 1;this.angle1 = -180;this.x1 = this.spinSize * 0.65;this.y1 = this.spinSize * 0.65;break;case 3:this.scale1 = 0.5;this.angle1 = -270;this.x1 = 0;this.y1 = this.spinSize * 0.65;break;case 4:this.scale1 = 1;this.angle1 = -360;this.x1 = 0;this.y1 = 0;break;}} else {switch (step) {case 1:this.scale2 = 0.5;this.angle2 = -90;this.x2 = 0;this.y2 = this.spinSize * 0.65;break;case 2:this.scale2 = 1;this.angle2 = -180;this.x2 = 0;this.y2 = 0;break;case 3:this.scale2 = 0.5;this.angle2 = -270;this.x2 = this.spinSize * 0.65;break;case 4:this.scale2 = 1;this.angle2 = -360;this.x2 = this.spinSize * 0.65;this.y2 = this.spinSize * 0.65;break;}}};return [{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(1),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(2),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(3),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(4),},];}@StyleschunkStyle() {.height(this.spinSize * 0.35).width(this.spinSize * 0.35).backgroundColor(this.spinColor).shadow(ShadowStyle.OUTER_DEFAULT_XS)}
}
代碼如下:
/*** TODO SpinKit動畫組件 - 雙粒子旋轉縮放動畫* author: CSDN-鴻蒙布道師* since: 2025/05/08*/
@ComponentV2
export struct SpinFour {// 參數定義@Require @Param spinSize: number = 36;@Require @Param spinColor: ResourceColor = '#209ED8';// 局部狀態@Local x1: number = 0;@Local y1: number = 0;@Local scale1: number = 1;@Local angle1: number = 0;@Local x2: number = this.spinSize * 0.65;@Local y2: number = this.spinSize * 0.65;@Local scale2: number = 1;@Local angle2: number = 0;aboutToAppear(): void {this.x2 = this.spinSize * 0.65;this.y2 = this.spinSize * 0.65;}build() {RelativeContainer() {Canvas().chunkStyle().translate({ x: this.x1, y: this.y1 }).scale({ x: this.scale1, y: this.scale1 }).rotate({ angle: this.angle1 })Canvas().chunkStyle().translate({ x: this.x2, y: this.y2 }).scale({ x: this.scale2, y: this.scale2 }).rotate({ angle: this.angle2 })}.width(this.spinSize).height(this.spinSize).onAppear(() => {this.startAnimation();});}/*** 啟動無限循環的關鍵幀動畫*/private startAnimation(): void {const uiContext = this.getUIContext();if (!uiContext) return;const keyframes1 = this.createKeyframes(1);const keyframes2 = this.createKeyframes(2);uiContext.keyframeAnimateTo({ iterations: -1, delay: 0 }, keyframes1);uiContext.keyframeAnimateTo({ iterations: -1, delay: 0 }, keyframes2);}/*** 根據粒子編號創建對應的關鍵幀動畫* @param particleIndex 粒子索引(1 或 2)*/private createKeyframes(particleIndex: 1 | 2): Array<KeyframeState> {const updatePositionAndScale = (step: number): void => {if (particleIndex === 1) {switch (step) {case 1:this.scale1 = 0.5;this.angle1 = -90;this.x1 = this.spinSize * 0.65;break;case 2:this.scale1 = 1;this.angle1 = -180;this.x1 = this.spinSize * 0.65;this.y1 = this.spinSize * 0.65;break;case 3:this.scale1 = 0.5;this.angle1 = -270;this.x1 = 0;this.y1 = this.spinSize * 0.65;break;case 4:this.scale1 = 1;this.angle1 = -360;this.x1 = 0;this.y1 = 0;break;}} else {switch (step) {case 1:this.scale2 = 0.5;this.angle2 = -90;this.x2 = 0;this.y2 = this.spinSize * 0.65;break;case 2:this.scale2 = 1;this.angle2 = -180;this.x2 = 0;this.y2 = 0;break;case 3:this.scale2 = 0.5;this.angle2 = -270;this.x2 = this.spinSize * 0.65;break;case 4:this.scale2 = 1;this.angle2 = -360;this.x2 = this.spinSize * 0.65;this.y2 = this.spinSize * 0.65;break;}}};return [{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(1),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(2),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(3),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(4),},];}@StyleschunkStyle() {.height(this.spinSize * 0.35).width(this.spinSize * 0.35).backgroundColor(this.spinColor).shadow(ShadowStyle.OUTER_DEFAULT_XS)}
}

3.修改Index.ets文件,代碼如下:
?

import { SpinFour } from './Spin';@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {Column() {SpinFour({spinSize: 60,spinColor: '#FF0000'})}.alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center).height('100%').width('100%')}
}代碼如下:
import { SpinFour } from './Spin';@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {Column() {SpinFour({spinSize: 60,spinColor: '#FF0000'})}.alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center).height('100%').width('100%')}
}

4.運行項目,登錄華為賬號,需進行簽名

5.動畫效果如下:
?

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

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

相關文章

基于STM32、HAL庫的CP2102-GMR USB轉UART收發器 驅動程序設計

一、簡介: CP2102-GMR是Silicon Labs公司生產的一款USB轉UART橋接芯片,主要特點包括: 集成USB 2.0全速功能控制器 內置USB收發器,無需外部電阻 工作電壓:3.0V至3.6V 支持的數據格式:數據位8,停止位1,無校驗 最高支持1Mbps的波特率 內置512字節接收緩沖區和512字節發送…

Ubuntu 22虛擬機【網絡故障】快速解決指南

Ubuntu22虛擬機突然無法連接網絡了&#xff0c;以下是故障排除步驟記錄。 Ubuntu 22虛擬機網絡故障快速解決指南 當在虛擬機中安裝的 Ubuntu 22 系統出現 ping: connect: 網絡不可達 和 ping: www.baidu.com: 域名解析出現暫時性錯誤的報錯時&#xff0c;通常意味著虛擬機無法…

實戰springcloud alibaba

實戰springcloud alibaba 前言 如何搭建一套最新的springcloud alibaba&#xff0c;以適配項目升級需求&#xff1f; 1.版本的選擇 2.各組件的適配 3.新技術的敏感性 4.前瞻性&#xff0c;幾年內不會被淘汰 參考資料&#xff1a;Spring Cloud Alibaba 參考文檔 https://spring…

泰迪杯特等獎案例學習資料:基于卷積神經網絡與集成學習的網絡問政平臺留言文本挖掘與分析

(第八屆“泰迪杯”數據挖掘挑戰賽A題特等獎案例深度解析) 一、案例背景與核心挑戰 1.1 應用場景與行業痛點 隨著“互聯網+政務”的推進,網絡問政平臺成為政府與民眾溝通的重要渠道。某市問政平臺日均接收留言超5000條,涉及民生、環保、交通等20余類訴求。然而,傳統人工…

DVWA靶場保姆級通關教程--06不安全驗證機制

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 目錄 文章目錄 前言 原理詳解 1. 前后端驗證邏輯不一致 2. 驗證碼值保存在客戶端 3. 驗證碼可預測或重復 4. 驗證碼驗證與邏輯解耦 一、處理關卡報錯 二、low級別源…

【LeetCode Hot100 | 每日刷題】排序數組

912. 排序數組 - 力扣&#xff08;LeetCode&#xff09; 題目&#xff1a; 給你一個整數數組 nums&#xff0c;請你將該數組升序排列。 你必須在 不使用任何內置函數 的情況下解決問題&#xff0c;時間復雜度為 O(nlog(n))&#xff0c;并且空間復雜度盡可能小。 示例 1&…

Windows系統下使用Kafka和Zookeeper,Python運行kafka(二)

1.配置 Zookeeper 進入解壓后的 Zookeeper 目錄&#xff08;例如 F:\zookeeper\conf&#xff09;&#xff0c;復制 zoo_sample.cfg 文件并命名為 zoo.cfg&#xff08;如果 zoo.cfg 已經存在&#xff0c;則直接編輯該文件&#xff09;。 打開 zoo.cfg 文件&#xff0c;配置相關…

Web 自動化之 HTML JavaScript 詳解

文章目錄 一、HTML 常用標簽二、javascript 腳本1、什么是 javascript(js)2、 js變量和函數3、js 彈窗處理4、js 流程控制語句和 switch 結構語句應用 一、HTML 常用標簽 HTML&#xff1a;超文本標記語言 超文本&#xff1a;不僅只包含文字&#xff0c;還有超鏈接、視頻…這些…

el-date-picker的type為daterange時僅對開始日期做限制

文章目錄 前言繡球html代碼一、正確代碼二、錯誤代碼 前言繡球 需求是這樣的&#xff0c;開始日期需要限制只能選擇今天的日期&#xff0c;結束日期只能選擇今天之后的日期。結束日期很常見&#xff0c;但是單純限制開始日期&#xff0c;還是蠻少見的&#xff0c;尤其是datera…

觀測云:安全、可信賴的監控觀測云服務

引言 近日&#xff0c;“TikTok 遭歐盟隱私監管機構調查并處以 5.3 億歐元”一案&#xff0c;再次引發行業內對數據合規等話題的熱議。據了解&#xff0c;僅 2023 年一年就產生了超過 20 億美元的 GDPR 罰單。這凸顯了在全球化背景下&#xff0c;企業在數據隱私保護方面所面臨…

認識中間件-以及兩個簡單的示例

認識中間件-以及兩個簡單的示例 什么是中間件一個響應處理中間件老朋友 nest g如何使用為某個module引入全局引入編寫邏輯一個日志中間件nest g mi 生成引入思考代碼進度什么是中間件 官方文檔 中間件是在路由處理程序之前調用的函數。中間件函數可以訪問請求和響應對象,以及…

基于Flask、Bootstrap及深度學習的水庫智能監測分析平臺

基于Flask、Bootstrap及深度學習的水庫智能監測分析平臺 項目介紹 本項目是基于Flask框架構建的水庫智能監測分析平臺&#xff0c;集水庫數據管理、實時監測預警、可視化分析和智能預測功能于一體。 預測水位的預警級別&#xff1a;藍色預警沒有超過正常水位且接近正常水位1米…

springboot生成二維碼到海報模板上

springboot生成二維碼到海報模板上 QRCodeController package com.ruoyi.web.controller.app;import com.google.zxing.WriterException; import com.ruoyi.app.domain.Opportunity; import com.ruoyi.app.tool.QRCodeGenerator; import com.ruoyi.common.core.page.TableDat…

如何使用極狐GitLab 軟件包倉庫功能托管 maven?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 軟件包庫中的 Maven 包 (BASIC ALL) 在項目的軟件包庫中發布 Maven 產物。然后&#xff0c;在需要將它們用作依賴項時安裝它…

企業如何將釘釘付款單高效集成到金蝶云星空?

釘釘數據集成到金蝶云星空&#xff1a;修改下推的付款單③ 在企業信息化系統中&#xff0c;數據的高效流轉和準確對接是實現業務流程自動化的關鍵。本文將分享一個實際案例&#xff0c;展示如何通過輕易云數據集成平臺&#xff0c;將釘釘中的付款單數據無縫集成到金蝶云星空系…

python 實現文件批量重命名

以下是使用Python實現文件批量重命名的示例代碼。該代碼可以將指定目錄下的文件按照一定規則進行重命名,這里以將文件重命名為帶有編號的文件名為例: import osdef batch_rename(directory):if not os.path.isdir(directory):print(

Pandas學習筆記(四)

DataFrame對象 文章目錄 DataFrame對象導入本文需要的包DataFrame與Series的相似之處使用read_csv函數導入DataFrameSeries和DataFrame的共享與專有屬性Series和DataFrame的共有方法 對DataFrame進行排序按照單列進行排序按照多列進行排序按照索引進行排序對列索引進行排序 設置…

DA14585墨水屏學習(2)

一、user_svc2_wr_ind_handler函數 void user_svc2_wr_ind_handler(ke_msg_id_t const msgid,struct custs1_val_write_ind const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id) {// sprintf(buf2,"HEX %d :",param->length);arch_printf("…

樹莓派5+Ubuntu24.04 LTS串口通信 保姆級教程

【背景】 各位&#xff0c;除了樹莓派4B之外&#xff0c;我又搞了個樹莓派5, 裝的也是Ubuntu24.04 LTS服務器版。裝系統的方法跟樹莓派4B一樣&#xff0c;沒什么好說的。裝完了系統之后&#xff0c;我就想裝個wiringPi來試試串口&#xff0c;卻發現這個樹莓派5的串口和樹莓派4…

【QT】UDP通訊本地調試

qt已經寫好了udp通訊代碼&#xff0c;現在要進行測試。 1、終端輸入ipconfig查看本機網卡的ipv4地址 2、 用udpBind函數&#xff0c;綁定到此ip和自定義的端口號。 3、 打開網絡調試助手&#xff0c;自動檢測到本機的ip地址&#xff0c;輸入任意一個和程序里不一樣的端口號。 …