【中软国际】HarmonyOS 自定义控件之JS进度条 原创 精华
中软国际AIoT开发者社区
发布于 2021-8-26 15:23
浏览
9收藏
前言
在我们日常开发的里面,很多场景经常会用到进度条,而系统提供的进度条样式又无法满足我们的使用,这时候我们就需要自定义一个进度条,自定义JS进度条主要涉及以下知识点:
- 如何自定义组件及引用
- 如何自定义绘制图形(draw)
- 如何创建并执行动画(animation)
- 如何设置自定义组件的参数(setter)
- 如何监听自定义组件的参数(getter)
效果演示
代码实现
如何自定义组件及引用
-
Js自定义组件,只需要新创建一个包,直接在里面编写界面,样式,逻辑代码即可。如果需要使用该组件,将其完整拷贝到自己的项目结构下进行引用即可。我们自定义一个
Progress
进度条控件,项目结构如下图:
-
使用的时候,我们需要给自定义组件进行标签声明,然后就可以使用该标签了:
<index.hml>
如何自定义绘制图形
说到自定义绘制,自然离不开canvas
,首先我们给自定义组件增加一个<canvas>
标签,并在JS
文件中描述绘制:
<progress.hml>
在JS中定义一个draw
方法,并且传入一个CanvasRenderingContext2D
参数,这个参数我们可以理解为canvas + paint
,所有绘制都是通过它进行调用:
<progress.js>
这部分逻辑并不复杂,都有注释,就是绘制一个圆环背景,然后根据进度参数在圆环上绘制一个圆弧进度,相信做过自定义控件的同学都能够非常熟悉。
如何创建并执行动画
- 首先我们需要在
init
的时候创建一个动画对象,并且设置好初始的动画参数:
<progress.js>
- 接着我们需要在特定的时候开启动画,例如我们在接收到外部传进来的进度参数后,我们需要更新动画的起始值和终止值,并且开始执行动画:
<progress.js>
如何设置自定义组件的参数
- 我们自定义组件,并不能像之前一样简单的暴露个公开方法给外部调用。由于其数据驱动的设计,我们可以定义一些自定义属性参数,当外部修改参数时我们就可以接收到信息进行主动动作(setter):
<progress.js>
- 监听这些对外暴露的属性值变化(listener):
<progress.js>
- 外部设置参数,当外部改变这些参数时,我们自定义组件内部的回调方法就会触发,并执行刷新逻辑:
<index.hml>
如何监听自定义组件的参数
上面我们说到了外部如何改变自定义组件内部的属性,本质上就是一个典型观察者模式。同理,外部调用者需要监听我们自定义组件的参数变化,也是通过这种方式:
- 首先我们在自定义组件中需要定义一个被观察者对象(key),并且在该对象值变化时对外发送消息:
<progress.js>
- 外部使用者需要注册监听回调方法,对被观察者对象(key)进行监听:
<index.hml>
<index.js>
其他关键点
<canvas>
标签的绘制内容默认是不显示的,我们可以在初始化的时候监听首帧回调,主动进行刷新一次:
<progress.js>
- 自定义组件如何获取宽高信息,在
API6+
系统已经提供相关的方法可以进行获取,类似onSizeChanged
中读取宽高信息:
<progress.js>
canvas
画布和我们通常理解的是不同的,它是存在绘制缓存的,所以每一帧刷新时,我们需要在绘制前先清空之前的绘制内容。目前鸿蒙清空画布时会概率出现闪屏问题。
以上就是实现一个自定义JS进度条的核心代码了,源代码:JsProgress
- 作者:卢日见
更多原创内容请关注:中软国际 HarmonyOS 技术学院
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
赞
13
收藏 9
回复
13
2
9
相关推荐
很实用
实用的小工具