鸿蒙NEXT自定义组件:太极Loading

news/2024/11/15 21:02:25/文章来源:https://www.cnblogs.com/zhongcx/p/18548639

 

【引言】(完整代码在最后面)

本文将介绍如何在鸿蒙NEXT中创建一个自定义的“太极Loading”组件,为你的应用增添独特的视觉效果。

【环境准备】

电脑系统:windows 10

开发工具:DevEco Studio NEXT Beta1 Build Version: 5.0.3.806

工程版本:API 12

真机:mate60 pro

语言:ArkTS、ArkUI

【项目分析】

1. 组件结构

我们将创建一个名为 TaiChiLoadingProgress 的自定义组件,它将模拟太极图的旋转效果,作为加载动画展示给用户。组件的基本结构如下:

@Component
struct TaiChiLoadingProgress {@Prop taiChiWidth: number = 400@Prop @Watch('animationCurveChanged') animationCurve: Curve = Curve.Linear@State angle: number = 0@State cellWidth: number = 0...
}

2. 绘制太极图案

使用鸿蒙NEXT提供的UI组件,如 Rect 和 Circle,构建太极图的黑白两部分。关键在于利用 rotate 方法实现太极图的旋转效果。

build() {Stack() {Stack() {// 黑色半圆背景Stack() {Rect().width(`${this.cellWidth}px`).height(`${this.cellWidth / 2}px`).backgroundColor(Color.Black)}.width(`${this.cellWidth}px`).height(`${this.cellWidth}px`).rotate({ angle: -90 }).align(Alignment.Top)// 大黑球 上Stack() {Circle().width(`${this.cellWidth / 2}px`).height(`${this.cellWidth / 2}px`).fill(Color.Black)Circle().width(`${this.cellWidth / 8}px`).height(`${this.cellWidth / 8}px`).fill(Color.White)}.width(`${this.cellWidth}px`).height(`${this.cellWidth}px`).align(Alignment.Top)// 大白球 下Stack() {Circle().width(`${this.cellWidth / 2}px`).height(`${this.cellWidth / 2}px`).fill(Color.White)Circle().width(`${this.cellWidth / 8}px`).height(`${this.cellWidth / 8}px`).fill(Color.Black)}.width(`${this.cellWidth}px`).height(`${this.cellWidth}px`).align(Alignment.Bottom)}.width(`${this.cellWidth}px`).height(`${this.cellWidth}px`).borderWidth(1).borderColor(Color.Black).borderRadius('50%').backgroundColor(Color.White).clip(true).rotate({angle: this.angle}).onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {if (isVisible && currentRatio >= 1.0) {this.startAnim()}if (!isVisible && currentRatio <= 0.0) {this.endAnim()}})}.width(`${this.taiChiWidth}px`).height(`${this.taiChiWidth}px`)
}

3. 动画实现

通过 animateTo 方法设置太极图的旋转动画,可以自定义动画曲线以实现不同的动画效果。

startAnim() {animateTo({duration: 2000,iterations: -1,curve: this.animationCurve}, () => {this.angle = 360 * 2})
}endAnim() {animateTo({duration: 0}, () => {this.angle = 0})
}

【完整代码】

@Component
struct TaiChiLoadingProgress {@Prop taiChiWidth: number = 400@Prop @Watch('animationCurveChanged') animationCurve: Curve = Curve.Linear@State angle: number = 0@State cellWidth: number = 0animationCurveChanged() {this.endAnim()this.startAnim()}startAnim() {animateTo({duration: 2000,iterations: -1,curve: this.animationCurve}, () => {this.angle = 360 * 2})}endAnim() {animateTo({duration: 0}, () => {this.angle = 0})}aboutToAppear(): void {this.cellWidth = this.taiChiWidth / 2}build() {Stack() {Stack() {//黑色 半圆 背景Stack() {Rect().width(`${this.cellWidth}px`).height(`${this.cellWidth / 2}px`).backgroundColor(Color.Black)}.width(`${this.cellWidth}px`).height(`${this.cellWidth}px`).rotate({ angle: -90 }).align(Alignment.Top)//大黑球 上Stack() {Stack() {Circle().width(`${this.cellWidth / 2}px`).height(`${this.cellWidth / 2}px`).fill(Color.Black)Circle().width(`${this.cellWidth / 8}px`).height(`${this.cellWidth / 8}px`).fill(Color.White)}}.width(`${this.cellWidth}px`).height(`${this.cellWidth}px`).align(Alignment.Top)//大白球 下Stack() {Stack() {Circle().width(`${this.cellWidth / 2}px`).height(`${this.cellWidth / 2}px`).fill(Color.White)Circle().width(`${this.cellWidth / 8}px`).height(`${this.cellWidth / 8}px`).fill(Color.Black)}}.width(`${this.cellWidth}px`).height(`${this.cellWidth}px`).align(Alignment.Bottom)}.width(`${this.cellWidth}px`).height(`${this.cellWidth}px`).borderWidth(1).borderColor(Color.Black).borderRadius('50%').backgroundColor(Color.White).clip(true).rotate({angle: this.angle}).onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {console.info('Test Row isVisible:' + isVisible + ', currentRatio:' + currentRatio)if (isVisible && currentRatio >= 1.0) {console.info('Test Row is fully visible.')this.startAnim()}if (!isVisible && currentRatio <= 0.0) {console.info('Test Row is completely invisible.')this.endAnim()}})}.width(`${this.taiChiWidth}px`).height(`${this.taiChiWidth}px`)}
}@Entry
@Component
struct Page08 {@State loadingWidth: number = 150@State isShowLoading: boolean = true;@State animationCurve: Curve = Curve.Linearbuild() {Column({ space: 20 }) {Text('官方Loading组件')Column() {LoadingProgress().width(this.loadingWidth).visibility(this.isShowLoading ? Visibility.Visible : Visibility.None)}.height(this.loadingWidth).width(this.loadingWidth)Text('自定义太极Loading组件')Column() {TaiChiLoadingProgress({ taiChiWidth: vp2px(this.loadingWidth), animationCurve: this.animationCurve }).visibility(this.isShowLoading ? Visibility.Visible : Visibility.Hidden)}.height(this.loadingWidth).width(this.loadingWidth)Row() {Flex({ wrap: FlexWrap.Wrap }) {Text('显示/隐藏').textAlign(TextAlign.Center).width('200lpx').height('200lpx').margin('10lpx').backgroundColor(Color.Black).borderRadius(5).backgroundColor(Color.Orange).fontColor(Color.White).clickEffect({ level: ClickEffectLevel.LIGHT }).onClick(() => {this.isShowLoading = !this.isShowLoading})Text('Linear动画').textAlign(TextAlign.Center).width('200lpx').height('200lpx').margin('10lpx').backgroundColor(Color.Black).borderRadius(5).backgroundColor(Color.Orange).fontColor(Color.White).clickEffect({ level: ClickEffectLevel.LIGHT }).onClick(() => {this.animationCurve = Curve.Linear})Text('FastOutLinearIn动画').textAlign(TextAlign.Center).width('200lpx').height('200lpx').margin('10lpx').backgroundColor(Color.Black).borderRadius(5).backgroundColor(Color.Orange).fontColor(Color.White).clickEffect({ level: ClickEffectLevel.LIGHT }).onClick(() => {this.animationCurve = Curve.FastOutLinearIn})Text('EaseIn动画').textAlign(TextAlign.Center).width('200lpx').height('200lpx').margin('10lpx').backgroundColor(Color.Black).borderRadius(5).backgroundColor(Color.Orange).fontColor(Color.White).clickEffect({ level: ClickEffectLevel.LIGHT }).onClick(() => {this.animationCurve = Curve.EaseIn})Text('EaseOut动画').textAlign(TextAlign.Center).width('200lpx').height('200lpx').margin('10lpx').backgroundColor(Color.Black).borderRadius(5).backgroundColor(Color.Orange).fontColor(Color.White).clickEffect({ level: ClickEffectLevel.LIGHT }).onClick(() => {this.animationCurve = Curve.EaseOut})Text('EaseInOut动画').textAlign(TextAlign.Center).width('200lpx').height('200lpx').margin('10lpx').backgroundColor(Color.Black).borderRadius(5).backgroundColor(Color.Orange).fontColor(Color.White).clickEffect({ level: ClickEffectLevel.LIGHT }).onClick(() => {this.animationCurve = Curve.EaseInOut})}.width('660lpx')}.width('100%').justifyContent(FlexAlign.Center)}.height('100%').width('100%').backgroundColor("#f9feff")}
}

  

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

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

相关文章

09C++选择结构(3)——教学

1、求3个整数中最小值; 2、3个数排序; 3、随机函数rand(); 4、if语句的应用; 5、bug与debug一、求3个整数中最小值 题目:输入三个整数,表示梨的重量,输出最小的数。 方法1:经过三次两两比较,得出最小值。 a<=b && a<=c min=ab<=c && b<=a…

趋动云—pycharm连接教程

一、创建项目 二、上传代码 三、启动趋动云虚拟环境四、连接pycharm 1. 打开pycharm,创建项目(上传代码),或者直接打开项目代码 2. 配置在线虚拟环境 (1)点击设置Settings->Python Interpreter->Add Interpreter->On SSH (2)新建在线虚拟环境连接 输入信息:…

校园AI语音识别霸凌监控系统

校园AI语音识别霸凌监控系统通过音频识别技术,校园AI语音识别霸凌监控系统针对校园内监控难以覆盖的区域,如厕所、宿舍、天台等,进行全天候的音频监控。系统通过识别特定的关键词,如“救命”、“老师救我”等,来监测可能发生的霸凌事件。系统采用YOLOv5 AI音频算法,该算法…

校园AI防霸凌报警系统

校园AI防霸凌报警系统利用先进的AI音频分析技术,校园AI防霸凌报警系统能够在没有摄像头的隐私区域,如厕所和宿舍,实时监测异常声音。系统的核心是YOLOv5算法,它能够准确识别出求救声、谩骂声等异常声音,从而触发报警机制。智能防欺凌终端是系统的前线设备,安装在校园的隐…

校园宿舍学生防欺凌检测系统

校园宿舍学生防欺凌检测系统通过在宿舍、卫生间、楼梯角等校园内隐蔽位置安装AI智能语音报警终端。校园宿舍学生防欺凌检测系统通过这些终端麦克风捕捉周围的声音,并将其传输至AI算法模型进行分析。校园宿舍学生防欺凌检测系统能够实时处理语音流,当识别出特定的关键词或短语…

餐厅明厨亮灶实施方案 后厨明厨亮灶监控系统

餐厅明厨亮灶实施方案 后厨明厨亮灶监控系统通过监控摄像机采集后厨人员的监控据,利用AI技术进行数据解决与分析。餐厅明厨亮灶实施方案 后厨明厨亮灶监控系统自动检测识别后厨人员的违规行为,若没有戴厨师帽、口罩、工服等,然后进行抓拍做好记录。系统一旦发现违规行为,立…

校园卫生间学生防欺凌监测系统

校园卫生间学生防欺凌监测系统在宿舍、厕所等关键位置部署监测终端,校园卫生间学生防欺凌监测系统通过AI音频算法分析技术能够实时处理音频流,并识别出预设的求救特征词或异常声音,如“救命”、“住手”等,这些通常与暴力或紧急情况相关联。一旦监测到预设的求救特征词或异…

【圆圆的日语教室】日语入门第2课

第二课 相似的假名平假名的书写あ(a)的书写第二笔不要太直,它是从草书演变过来的,特点是圆润有弧度 第三笔要交叉 长得像“安”い(i)的书写第一笔要勾上去う(u)的书写第一笔:点 第二笔:起笔不要太平,先往上走再往下拐。え(e)的书写像π 第一笔:点 第二笔:横上去,折下来…

08C++选择结构(2)

1、逻辑变量; 2、逻辑运算符; 3、逻辑运算符的优先级; 4、复合语句一、逻辑变量 教学视频 存储类似灯亮或灯灭、是男还是女等结果只有两种可能的数据时,可以使用逻辑型变量。 逻辑型变量用关键字bool定义,所以又称为布尔变量,其值只有两个false(假)和true(真),false…

【跟着阿舜学音乐-笔记】1.11和弦的表现形式

和弦的分配 在音乐演奏中,和弦会有纵向和横向两种分配形式。 和弦最低的音铺垫了整体和弦宏观色彩与基调,一般词用和弦的根音,但并不一定。 同时最低的音通常要与上方的音有一定距离,一般是大于等于五度,具体也和音区有关。 所谓和声铺底,就是铺设主要和弦音的区域,一般…

NOIP2024加赛5

以后我要天天给学弟加hack,以后我要每个包绑一个hack。 交 hack,说高尚了,是在给你找错,代码有不是他写的,错又不是他犯的,找出错来想让大家警示一下,还要费心想 hack,你有什么理由骂。 退一万步讲,人家喜欢 hack 怎么你了,你可以过题来获得快感,人家不能插你代码获…

团队作业4——项目冲刺-5

信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 白蓝昏紫队团队集体协作完成项目开发GitHub链接 https://www.cnblogs.com/zayer11/p/18545116团队简介 队名:白蓝昏紫队 队员姓名 学号许億驰 3122004883(组长)陈文杰 3122004858沈思敏 3122004877王峥…