文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

HarmonyOS - 基于ArkUI(JS)实现自定义Circle进度条

2024-12-01 15:47

关注

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

前言

最近在FA项目开发中,遇到类似这样的圆形进度条,参考开发文档利用canvas封装成了一个组件,这是一个基于JS扩展的类Web开发范式组件中的基础组件 。

组件介绍

circle进度条组件在开发中经常用到,形式多种多样,参考canvas文档做了简单的一种,支持各种属性调整。有需要可以参考看看。

代码演示

<circularBar  percent = '80' ></circularBar>
<circularBar  percent = '60' istext = 'true'></circularBar>
<circularBar  percent = '60'  bg-width = '20' f-width = '20'></circularBar>
<circularBar  percent = '60' color-c = '#ff6600'></circularBar>
<circularBar  percent = '60' color-num = '2' start-c = '#f463b2' end-c = '#376af9'></circularBar>
<circularBar  percent = '60' bg-color = '#6a6a6a'></circularBar>
<circularBar  percent = '60' direction = 'true'></circularBar>

注意:

父子组件属性使用:camelCase (驼峰命名法) 的 prop 名,在外部父组件传递参数时需要使用 kebab-case (短横线分隔命名) 形式,即当属性compProp在父组件引用时需要转换为comp-prop。

API

props

参数

说明

类型

默认值

percent

进度条百分比

Number

50

colorNum

颜色值,1:纯色 2: 渐变色

String

-

bgWidth

背景圈的宽度

Number

10

fWidth

动态圈的宽度

Number

10

istext

显示百分比文字

Boolean

false

direction

绘制方向,顺时针false/逆时针true

Boolean

false

bgColor

背景圈颜色

String

‘#cccccc’

部分代码展示

1、html部分

<div class="container">
<div style="margin-left: 10%;">
<canvas ref="canvasbox" style="width: 100px; height: 100px;">
canvas>
div>
div>

2、js部分

相关api参考

名称

类型

默认值

描述

​lineCap​

string

‘butt’

指定线端点的样式,可选值为:- ‘butt’:线端点以方形结束。- ‘round’:线端点以圆形结束。- ‘square’:线端点以方形结束,该样式下会增加一个长度和线段厚度相同,宽度是线段厚度一半的矩形。

​strokeStyle​

| ​​CanvasGradient​​​ | ​​CanvasPattern​

-

设置描边的颜色。- 类型为时,表示设置描边使用的颜色。- 类型为CanvasGradient时,表示渐变对象,使用​​createLinearGradient​​​方法创建。- 类型为CanvasPattern时,使用​​createPattern​​方法创建。

​font​

string

‘normal normal 14px sans-serif’

设置文本绘制中的字体样式。语法:ctx.font=‘font-size font-family’- font-size(可选),指定字号和行高,单位只支持px。- font-family(可选),指定字体系列。语法:ctx.font=‘font-style font-weight font-size font-family’- font-style(可选),用于指定字体样式,支持如下几种样式:‘normal’,talic。- font-weight(可选),用于指定字体的粗细,支持如下几种类型:‘normal’, ‘bold’, ‘bolder’, ‘lighter’, 100, 200, 300, 400, 500, 600, 700, 800, 900。- font-size(可选),指定字号和行高,单位只支持px。- font-family(可选),指定字体系列,支持如下几种类型:‘sans-serif’, ‘serif’, ‘monospace’。

//初始绘制
onPageShow(){
setTimeout(()=>{
const darw_el = this.$refs.canvasbox;
console.info(darw_el)
//颜色取值不支持#ccc #f60 十六进制颜色 不支持缩写
this.circleFun(darw_el,this.colorNum,this.percent,this.bgWidth,this.fWidth,this.bgColor,this.textColor,this.istext,this.direction,this.startC,this.endC,this.colorC)
},200)
},
//定义变量
var rect = draw_item.getBoundingClientRect();
var context = draw_item.getContext('2d');
var center_x = (rect.width)/2;
var center_y = (rect.height)/2;
var rad = (Math.PI *2) /100;
var speed = 0;
// 绘制后面的圈圈
function backCircle(){
context.save()
context.beginPath()
context.lineWidth = lineWidth_b // 设置线宽
var radius = center_x - context.lineWidth //设置半径
context.lineCap = 'round' //结尾形状
context.strokeStyle = color_b //线条颜色
context.arc(center_x, center_y, radius, 0, Math.PI * 2, false)
context.stroke()
context.closePath()
context.restore()
}
//绘制前面的圈圈
function foceCircle(n){
context.save()
//context.strokeStyle = color_f //决定圆环颜色
context.lineWidth = lineWidth_f;//前面动态圈宽度
context.lineCap = 'round';//结尾形状
var radius = center_x - context.lineWidth;//半径
context.beginPath()
if (colornums == 1) {
context.strokeStyle = Color_C
}
if (colornums == 2) {
//创建渐变对象,渐变开始点和渐变结束点
let g = context.createLinearGradient(0, 90, 90, 0);
g.addColorStop(0, start_C); //添加颜色点
g.addColorStop(1, end_C); //添加颜色点
context.strokeStyle = g; //使用渐变对象作为圆环的颜色
}
//用于绘制圆弧context.arc(x坐标,y坐标,半径,起始角度,终止角度,顺时针/逆时针)
//context.arc(center_x,center_y,radius, -Math.PI / 4,-Math.PI / 4 + n * rad,direct )
context.arc(center_x,center_y,radius, Math.PI / 20, n*rad, direct )
context.stroke()
context.closePath()
context.restore()
}
//绘制文字
function text(n) {
context.save();
context.fillStyle = color_f; //文字颜色
var font_size = 20 ;//字体大小
context.font = font_size + 'px Helvetica' //字体大小和文字形状
var text_width = context.measureText(n.toFixed(0) + '%').width;//文字宽度
context.fillText(n.toFixed(0) + '%', center_x - text_width / 2, center_y + font_size / 2)
context.restore()
}
//执行动画
(function drawFrame() {
if (speed <= percent) {
requestAnimationFrame(drawFrame)
} else {
return false
}
context.clearRect(0, 0, rect.width, rect.height)
//context.globalCompositeOperation = "copy"
backCircle();
//控制百分比文字显示、隐藏
if(textshow){
text(speed);
}
foceCircle(speed);
if (speed >= percent) {
speed ++
} else {
speed += 1
}
})()

总结

此自定义组件运用了canvas绘制,使用和练习中参考官方api,也结合了组件通信,父子组件直接的传值。

缺点是不支持拖动事件,在事件这部分没有做添加。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

来源:​​51CTO开源基础软件社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯