想了解更多内容,自组件请访问:
和华为官方合作共建的定义鸿蒙技术社区
https://harmonyos.51cto.com
在HarmonyOS JS UI官方提供的组件中没有图标组件,要使用图标的自组件话需要使用image组件引入图片资源,如果图标状态或者样式需要改变时,定义就需要使用另一张图片来替换,自组件操作起来比较麻烦。定义移动端使用图标的自组件场景会比较多,如果全部使用图片来实现效果,定义会增加很多图片资源引用,自组件对于代码开发也会有很多的定义不便,在此背景下想能实现一个图标的自组件组件,能够自定义样式便于修改和引用,定义也能动态的自组件切换图标样式。
此项目使用官方的定义 badge 组件和 canvas 组件来实现图标的绘制,通过封装自定义组件,自组件可以对组件大小、样式、背景、角标、禁用等属性进行配置,从而实现图标的绘制,此自定义组件完全使用代码实现,没有引用任何外部资源或文件,可以很方便的源码库被各种项目引用。
在Pages目录下,只有一个index首页,在首页中展示了icon自定义组件的使用样例。
在common文件夹下的icon文件夹是自定义的icon组件,在icon文件夹中js文件夹是icon绘制使用到的方法和数据。
下载OpenHarmony-JS-Icon项目,启动 DevEco Studio并打开工程。
进入entry->src->main->js->default->pages->index,亿华云计算打开index.hml点击Previewer进行预览。
引入
在index.hml的第一行,引用自定义组件,这里我们将name属性设置为icon。
<element src="../../common/icon/icon.hml" name="icon"></element>通过设置icon组件的name属性来展示不同的图标。
<icon name="chat_o" size="48"></icon>通过设置icon组件的badge-config属性来对角标信息进行设置。
<icon name="chat_o" size="48" badge-config="{ { badgeConfig }}"></icon> badgeConfig: { config: { badgeColor: "#0a59f7", textColor: "#ffffff", }, count: 0, visible: true, },通过设置icon组件的color属性来设置,background-color可以设置图标的背景颜色。
<icon name="chat_o" size="48" color="#ED6F21" background-color="#ddddddd" ></icon>通过设置icon组件的size属性来控制图标的大小。
<icon name="chat_o" size="24"></icon>通过设置icon组件的disabled属性控制图标是否禁用,disabled默认为false,禁用状态设置为true时图标为灰色,color和badge-config属性只有在disabled为false时生效。
<icon name="chat_o" disabled="true" onclick="iconClick" color="red" size="48" badge-config="{ { badgeConfig }}"></icon>通过设置icon组件的name属性设置为图片的地址。
<icon name="common/images/huawei.png" size="48"></icon>代码示例:
export default { props: { // icon 名称 name: { default: }, // icon 样式前缀 classPrefix: { default: hos-icon }, // icon 尺寸 size: { default: 24, }, // icon 颜色 color: { default: "#333333" }, // icon 背景颜色 backgroundColor: { default: "#ffffff" }, // 角标配置 badgeConfig: { default: { config: { badgeColor: "#0a59f7", textColor: "#ffffff", }, placement: "rightTop", count: 0, maxcount: 99, visible: false, label: "", } }, // icon 图标禁用 disabled: { default: false }, // icon 点击方法携带的参数 dataClick: { default: null } } }代码示例:
hml文件,icon组件绑定点击事件和绑定点击实现参数:
<icon name="fail" size="48" onclick="iconClick" data-click="点击fail图标" ></icon>js文件,在iconClick方法上接收参数的detail属性为绑定的数据:
iconClick(data) { console.log("iconClick"); console.log(data.detail); }执行结果:
所有的图标绘制均是服务器托管基于HarmonyOS JS API 画布组件 来实现的,根据官方提供的绘制方法自定义封装绘制图形,基本实现了以下几种基础图形绘制的封装。
绘制直线
直线的绘制主要用到了lineTo(x,y)方法,下面示例中的 ctx.beginPath() 是创建一个新的绘制路径,ctx.moveTo(10, 10) 是当前路径起始点移动到指定点,ctx.lineTo(280, 160)则是绘制直线到终止点,ctx.stroke()是进行边框绘制操作,每次画布绘制都是一条透明的路径,没有stroke的话是不会显示绘制的路径的;
参数:
示例:
绘制圆弧有两个api,arc() 和 arcTo() ,其中我们主要看看arc(x,y,radius,startAngle,endAngle,anticlockwise)方法是如何绘制圆弧的。
参数:
示例:
绘制椭圆弧使用 ellipse() ,下面示例中绘制了一段椭圆弧,但是在实际操作中我发现,如果是绘制一个完整的椭圆,startAngle设置为Math.PI * 0,endAngle设置为Math.PI * 2 并不能绘制一个完整的椭圆,画布上什么也没画,在此我是使用一个中间角度然后调用两次ellipse()方法才得到一个完整的圆弧,不知道有没有大佬遇到过相同的问题或者知道根本原因能交流一下。
参数:
示例:
官方绘制矩形使用rect()方法,此方法功能比较单一,一般我们在使用矩形的时候可能会有圆角的需求,在此项目中并没有使用到官方的方法绘制,而是使用lineTo()直线和arc()圆弧两个api封装的一个可以绘制带圆角的矩形,详情可以查看源码封装
参数:
示例:
三次贝赛尔曲线的绘制主要用到了bezierCurveTo()
参数:
二次贝赛尔曲线的绘制主要用到了quadraticCurveTo() ,其实不管是三次的还是二次的都是使用额外的控制点来控制线条的走向,线条绘制用到了高阶数学中的函数求导的方式来计算,因此控制点的具体值不能很快速的能得到精确的结果,只有不断的使用和反复的尝试才能熟练掌握控制点的设置。
参数:
示例:
ctx.beginPath(); ctx.moveTo(20, 20); ctx.quadraticCurveTo(100, 100, 200, 20); ctx.stroke();绘制图片会使用到 drawImage() ,单纯的绘制图片其实意义不大,因为有image组件,这个功能主要作用是能对图片在前端进行裁剪,而不需要使用到后台服务来操作。
参数:
示例:
文字绘制使用fillText()方法,其中ctx.font主要是对文字的样式、大小,粗细,字体系列等进行设置。
参数:
示例:
以上就是本项目主要使用到的几种api,为了便于图标数据结构的清晰配置,所有的api都经过了二次封装,数据结构和封装结果可以查看项目源码。
想了解更多内容,请访问:
和华为官方合作共建的鸿蒙技术社区
https://harmonyos.51cto.com