【OpenHarmony 实战开发】 做一个 loading加载动画

news2024/11/18 3:31:53
  • 本篇文章介绍了如何实现一个简单的 loading 加载动画,并且在文末提供了一个 demo 工程供读者下载学习。
  • 作为一个 OpenHarmony 南向开发者,接触北向应用开发并不多。北向开发 ArkUI 老是改来改去,对笔者这样的入门选手来说学习成本其实非常大,希望后面可以慢慢稳定下来吧。最近努力学习了一些,下面将学习经验分享如下:
  • 通过本文您将了解:
    1、使用 ImageAnimator 帧动画组件实现一个自定义 loading 加载动画。
    2、使用 Progress 进度条组件实现 loading 加载动画。

笔者开发环境:(文末附有 demo ArkUI 应用源码,一定得是以下 IDE 和 SDK 版本或者更高版本才能编译运行,这也是坑点之一!!!)

  • 开发板:润和软件 DAYU200 开发板
  • OpenHarmony 版本:OpenHarmony3.2 Beta5
  • IDE:DevEco Studio 3.1.0.200
  • SDK:API9(3.2.10.6)

效果演示

1. 涉及到的知识点 (先大概了解一下,知道要用到这些东西就行)

  • 创建自定义组件
  • ImageAnimator 帧动画组件
  • Progress 进度条组件
  • CustomDialogController 自定义弹窗组件
  • 定时器 API
  • Row 组件
    沿水平方向布局容器。
  • OpenHarmony 组件导读

2、使用 ImageAnimator 帧动画组件自定义 loading 动画开发步骤:

├── ets
│   ├── loading      # loading动画图片帧
│   └── pages        # ets代码
│       ├── Index.ets
│       ├── loadingComponent_part1.ets
│       ├── loadingComponent_part2.ets #ImageAnimator帧动画组件实现自定义loading加载动画
│       └── loadingComponent_part3.ets #Progress进度条组件实现的loading加载动画

2.1 将自定义的 loading 动画的图片帧放在 ets 目录下

  • 组成自定义的 loading 动画的图片帧,详情请见文末提供的 demo 工程

  • 在 entry\src\main\ets 新建一个 loading 目录,将其放在该目录下

2.2 用帧动画组件将动画封装成一个自定义组件

  • ImageAnimator 帧动画组件
  • 在 entry\src\main\ets\pages 下新建.ets 文件
//loadingComponent_part1.ets
 @Component

export default struct loadingComponent_part1 {
  private imageWidth: number | Resource = 0
  private imageHeight: number | Resource = 0

  build() {
    Column() {
      ImageAnimator()
        .images([
          {
            src: '/loading/loading01.png',
            duration: 200, //每一帧图片的播放时长,单位毫秒
          },
          {
            src: '/loading/loading02.png',
            duration: 200,
          },
          {
            src: '/loading/loading03.png',
            duration: 200,
          },
          {
            src: '/loading/loading04.png',
            duration: 200,
          },
          {
            src: '/loading/loading05.png',
            duration: 200,
          },
          {
            src: '/loading/loading06.png',
            duration: 200,
          }])
        .width(this.imageWidth)
        .height(this.imageHeight)
        .iterations(-1)  
          //	设置播放顺序。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。

        .fixedSize(true) 
          //设置图片大小是否固定为组件大小。 true表示图片大小与组件大小一致,此时设置图片的width 、height 、top 和left属性是无效的。false表示每一张图片的width 、height 、top和left属性都要单独设置。

        .reverse(true) 
          //设置播放顺序。false表示从第1张图片播放到最后1张图片; true表示从最后1张图片播放到第1张图片。

        .fillMode(FillMode.None)
          //设置动画开始前和结束后的状态,可选值参见FillMode说明

        .state(AnimationStatus.Running)  
          //Running表示动画处于播放状态
    }
  }
}

2.3 在主页面实现自定义的 loading 动画(完整代码见文末 demo 工程)

  • 首先导入自定义的 loading 动画
import loading1 from './loadingComponent_part1';
  • 使用 CustomDialogController 自定义弹窗组件 自定义一个弹窗用于在主页面实现 loading 动画
struct Index {
  //用来绘制loading动画的
  // 要打开在点击事件中添加 this.loading1.open();
  // 要关闭在点击事件中添加 this.loading1.close();
  // 通过CustomDialogController类显示自定义弹窗。
  private loading1: CustomDialogController = new CustomDialogController({
    builder: loadingProgress_part1(),
    alignment: DialogAlignment.Center,
    offset: ({ dx: 0, dy: 0 }),
    autoCancel: false,
    customStyle: true
  });
}

//用来绘制loading动画的
@CustomDialog
struct loadingProgress_part1{
  controller: CustomDialogController;

  build() {
    Column() {
      loading1({ imageWidth: 80,
        imageHeight: 80 }).margin({top:350})

    }
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center)
    .backgroundColor(Color.White)
  }

}
  • 使用定时器 API 控制 loading 动画
Button(this.message1)
          .margin({top:100})
          .fontWeight(FontWeight.Normal)
          .backgroundColor(Color.Green) //设置按钮颜色
          .onClick(() => {

            //开始绘制loading动画
            this.loading1.open();
            //使用一个setTimeout定时器,setTimeout中第一个参数使用 () => { 要执行的函数 }
            //this.ocrDialog.close();是关闭loading动画
            setTimeout( () => {this.loading1.close();} , 3000);

          })
  • 实现效果

3、使用 Progress 进度条组件实现 loading 加载动画开发步骤:

Progress 进度条组件

(完整代码见文末 demo 工程)

struct Index {
  @State i: number = 0

  //aboutToAppear	函数在创建自定义组件的新实例后,在执行其build函数之前执行。
  aboutToAppear(){
    //定时器中的setInterval: 重复调用一个函数,在每次调用之间具有固定的时间延迟。
    setInterval( () => {  this.i = this.i + 10  } , 300);
  }

  build() {
...

        Progress({ value: this.i, type: ProgressType.Linear })
          .width(200)
          .margin({top:30})

        Progress({ value: this.i, total: 150, type: ProgressType.ScaleRing })
          .color(Color.Green).value(this.i).width(50)
          .margin({top:30})
          .style({ strokeWidth: 15, scaleCount: 15, scaleWidth: 5 })
...
}

}
  • 实现效果

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车载测试___长安汽车车机测试项目

项目介绍: 长安汽车车机是以腾讯车载互联为基础,融合了多媒体影音系统(QQ音乐、喜马拉雅FM、酷我音乐)、车载导航、车辆功能设定这些选项,可以在线听歌、导航、查看360度全景影像辅助系统,让车主驾车更加安逸享受。 具体模块包含远程车辆状…

深度学习笔记001

目录 一、批量规范化 二、残差网络ResNet 三、稠密连接网络(DenseNet) 四、循环神经网络 五、信息论 六、梯度截断 本篇blog仅仅是本人在学习《动手学深度学习 Pytorch版》一书中做的一些笔记,感兴趣的读者可以去官网http://zh.gluon.a…

英特尔StoryTTS:新数据集让文本到语音(TTS)表达更具丰富性和灵感

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! 英特尔StoryTTS:新数据集让文本到语音(TTS)表达更具丰富性和灵感 引言:探索文本表达性在语音合成中的重要性 …

Imagine Flash、StyleMamba 、FlexControl、Multi-Scene T2V、TexControl

本文首发于公众号:机器感知 Imagine Flash、StyleMamba 、FlexControl、Multi-Scene T2V、TexControl You Only Cache Once: Decoder-Decoder Architectures for Language Models We introduce a decoder-decoder architecture, YOCO, for large language models, …

C++从入门到入土(二)——初步认识类与对象

目录 前言 类与对象的引入 类的定义 类的访问限定符及封装 访问限定符: 封装: 类的作用域 类的实例化 类的大小 this指针 this指针的特性 前言 各位佬们,在开始本篇文章的内容之前,我想先向大家道个歉,由于…

Linux流量分析工具 | nethogs

在应急过程中,经常会遇到应用访问缓慢,网络阻塞的情况,分析原因可能会想到存在恶意程序把带宽占满的可能。通过这样一个小工具可以快速定位异常占用带宽程序的路径、PID、占用流量大小或是排除由带宽占满导致服务器缓慢的猜想。 一、简介 Ne…

GitHub Actions 手动触发方式

目录 前言 Star Webhook 手动触发按钮 前言 GitHub Actions 是 Microsoft 收购 GitHub 后推荐的一款 CI/​CD 工具早期可能是处于初级开发阶段,它的功能非常原生,甚至没有直接提供一个手动触发按钮一般的触发方式为代码变动(push 、pull…

Linux网络-PXE高效批量网络装机(命令+截图详细版)

目录 一.部署PXE远程安装服务 1.PXE概述 1.1.PXE批量部署的优点 1.2.要搭建PXE网络体系的前提条件 2.搭建PXE远程安装服务器 2.1.修改相关网络配置(仅主机模式) 2.2.关闭防火墙(老规矩) 2.3.保证挂载上 2.4.准备好配置文…

如何使用IntelliJ IDEA SSH连接本地Linux服务器远程开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

【面经】网络

了解TCP/IP协议,了解常用的网络协议:study-area 一、TCP/IP协议 TCP/IP协议是一组网络通信协议,旨在实现不同计算机之间的信息传输。 1、TCP/IP四层模型: 网络接口层、网络层、传输层和应用层。 网络接口层:定义了数据的格式和…

C++ 基础 输入输出

一 C 的基本IO 系统中的预定义流对象cin和cout: 输入流:cin处理标准输入,即键盘输入; 输出流:cout处理标准输出,即屏幕输出; 流:从某种IO设备上读入或写出的字符系列 使用cin、cout这两个流对…

【springboot基础】如何搭建一个web项目?

正在学习springboot,还是小白,今天分享一下如何搭建一个简单的springboot的web项目,只要写一个类就能实现最基础的前后端交互,实现web版helloworld ,哈哈,虽然十分简陋,但也希望对你理解web运作…

车载测试系列:车载蓝牙测试(三)

HFP测试内容与测试方法 2.3 接听来电:测试手机来电时,能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件:待测手机与车载车载设备处于连接状态 2、测试步骤: 1)用辅助测试机拨打待测手机&…

【JavaWeb】Servlet+JSP+EL表达式+JSTL标签库+Filter过滤器+Listener监听器

需要提前准备了哪些技术,接下来的课才能听懂? JavaSE(Java语言的标准版,Java提供的最基本的类库) Java的开发环境搭建Java的基础语法Java的面向对象数组常用类异常集合多线程IO流反射机制注解Annotation… MySQL&…

CUDA流和事件

CUDA通过流来实现网格级并发。 流和事件 CUDA流是一系列异步的CUDA操作,这些操作按照主机代码确定的顺序在设备上执行。流可以封装这些操作,保持操作的顺序,允许操作在流中排队,并使他们在先前的所有操作之后执行。 这些操作包…

【Linux】在Linux中执行命令ifconfig, 报错-bash:ifconfig: command not found解决方案

一、报错信息 ifconfig 报错-bash:ifconfig: command not found 同时,通过ip addr查看,也看不到IP信息 二、解决方案 找到ifcfg-ens0文件,此文件的目录在/etc/sysconfig/network-scripts目录下 命令:cd /etc/sysconfig/network…

Windows系统本地部署DrawDB数据库设计工具并实现无公网IP远程访问

文章目录 1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 开发中很多时候都会使用到数据库,所以选择一个好用的数据库设计工具会让工作效率翻倍。在当今数字化时代,数据库管理是许多企业和个人项目的核心。设…

buuctf-misc题目练习二

ningen 打开题目后是一张图片,放进winhex里面 发现PK,PK是压缩包ZIP 文件的文件头,下一步是想办法进行分离 Foremost可以依据文件内的文件头和文件尾对一个文件进行分离,或者识别当前的文件是什么文件。比如拓展名被删除、被附加…

Spring - 9 ( 10000 字 Spring 入门级教程 )

一: MyBatis XML 配置文件 Mybatis 的开发有两种方式: 注解XML 我们已经学习了注解的方式, 接下来我们学习 XML 的方式 MyBatis XML 的方式需要以下两步: 配置数据库连接字符串和 MyBatis写持久层代码 1.1 配置连接字符串和 MyBatis 此步骤需要进…

【经验分享】企业网站建设,不收录的原因有哪些

今天来聊一聊我们做好网站,但是网站排名不高,各大搜索引擎不收录网站的原因: 1.网站结构问题: 公司网站的结构是搜索引擎判断网站内容的关键因素之一。如果网站结构混乱、不清晰,搜索引擎可能难以准确抓取和理解网站的…