canvas之进度条

news2024/12/28 5:34:05
canvas之进度条

效果:

在这里插入图片描述

封装的组件
<template>
    <div class="circle" :style="{ width: props.radius + 'px', height: props.radius + 'px' }">
        <div class="circle-bg" :style="{ width: props.radius - 5 + 'px', height: props.radius - 5 + 'px', borderWidth: props.lineWidth + 'px', borderColor: props.borderColor }"></div>
        <canvas :id="circleProgressId" class="circle-progress"></canvas>
    </div>
</template>
<script lang="ts" setup>
import { uniqueId } from 'lodash';

const props = withDefaults(
    defineProps<{
        radius?: number; // 半径
        color?: string[]; // 渐变颜色
        progress: number; // 进度
        lineWidth?: number; // 线宽
    }>(),
    {
        radius: 35,
        color: () => ['rgb(72, 157, 125)', 'rgb(52, 254, 125)'],
        progress: 50,
        lineWidth: 16,
        borderColor: 'rgba(0, 150, 255, 1)',
    }
);

// 随机表格id
const circleProgressId: string = uniqueId('circleProgress_');

watch(
    () => props.progress,
    () => {
        nextTick(() => {
            draw();
        });
    },
    {
        deep: true,
        immediate: true,
    }
);

let circleLoading: any = null;

const draw = () => {
    circleLoading && clearInterval(circleLoading);
    let process = 0.0; // 进度
    const canvas: any = document.getElementById(circleProgressId);
    if (!canvas) {
        setTimeout(draw, 200);
        return;
    }
    const ctx = canvas.getContext('2d');
    const percent = props.progress; // 最终百分比
    const circleX = canvas.width / 2; // 中心x坐标
    const circleY = canvas.height / 2; // 中心y坐标
    const radius = props.radius / 2; // 圆环半径
    const lineWidth = props.lineWidth; // 圆形线条的宽度
    // const fontSize = 50; // 字体大小

    circleLoading = setInterval(() => {
        loading();
    }, 33);

    // 画圆
    function circle(cx: any, cy: any, r: any) {
        ctx.beginPath();
        ctx.moveTo(cx + r, cy);
        ctx.lineWidth = lineWidth;
        ctx.strokeStyle = 'transparent';
        ctx.arc(cx, cy, r, 0, Math.PI * 2);
        ctx.closePath();
        ctx.stroke();
    }

    // 画弧线
    function sector(cx: any, cy: any, r: any, progress: number) {
        ctx.beginPath();
        ctx.moveTo(cx, cy - r);
        ctx.lineWidth = lineWidth;
        // 渐变色 - 可自定义
        const linGrad = ctx.createLinearGradient(circleX, circleY + radius + lineWidth, circleX, circleY - radius - lineWidth);
        linGrad.addColorStop(0.0, props.color[1]);
        linGrad.addColorStop(1.0, props.color[0]);
        // linGrad.addColorStop(0.5, '#9bc4eb');
        ctx.strokeStyle = linGrad;
        const startAngle = (Math.PI * 3) / 2;
        ctx.arc(cx, cy, r, startAngle, startAngle + Math.PI * 2 * progress);
        ctx.stroke();
    }

    // 刷新
    function loading() {
        // 清除canvas内容
        ctx.clearRect(0, 0, circleX * 2, circleY * 2);

        // 中间的字
        // ctx.font = fontSize + 'px April';
        // ctx.textAlign = 'center';
        // ctx.textBaseline = 'middle';
        // ctx.fillStyle = '#999';
        // ctx.fillText(parseFloat(process).toFixed(0) + '%', circleX, circleY);

        // 圆形
        circle(circleX, circleY, radius);

        // 圆弧
        process > 0 && sector(circleX, circleY, radius, process / 100);

        // 画到传入百分比后停止
        if (process === percent) {
            clearInterval(circleLoading);
            return;
        }

        // 控制结束时动画的速度
        if (process / percent > 0.9) {
            process += 0.8;
        } else if (process / percent > 0.8) {
            process += 1.05;
        } else if (process / percent > 0.7) {
            process += 1.25;
        } else {
            process += 1.5;
        }

        // 超出时用传入百分比
        if (process > percent) {
            process = percent;
        }
    }
};
</script>
<style lang="scss" scoped>
.circle {
    width: 100%;
    height: 100%;
    position: relative;

    .circle-bg {
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        border: 8px solid rgba(42, 113, 88, 0.2); /* 圆环的颜色 */
        border-radius: 50%; /* 设置为50%表示绘制圆形 */
    }

    .circle-progress {
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%) scale(-1, 1) !important;
    }
}
</style>

使用方式
<CircleProgress
    :radius="60"
    borderColor="rgba(0, 150, 255, 1)"
    :progress="75"
    :color="['#0096FF', '#0096FF']"
    :lineWidth="3"
/>

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

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

相关文章

Boost之log日志使用

不讲理论&#xff0c;直接上在程序中可用代码&#xff1a; 一、引入Boost模块 开发环境&#xff1a;Visual Studio 2017 Boost库版本&#xff1a;1.68.0 安装方式&#xff1a;Nuget 安装命令&#xff1a; #只安装下面几个即可 Install-package boost -version 1.68.0 Install…

18.springcloud_openfeign之扩展组件二

文章目录 一、前言二、子容器默认组件FeignClientsConfigurationDecoder的注入Contract约定 对注解的支持对类上注解的支持对方法上注解的支持对参数上注解的支持MatrixVariablePathVariableRequestParamRequestHeaderSpringQueryMapRequestPartCookieValue FormattingConversi…

7-8 N皇后问题

目录 题目描述 输入格式: 输出格式: 输入样例: 输出样例: 解题思路&#xff1a; 详细代码&#xff08;dfs&#xff09;&#xff1a; 简单代码&#xff08;打表&#xff09;&#xff1a; 题目描述 在NN格的国际象棋盘上摆放N个皇后&#xff0c;使其不能互相攻击&#xff0c;即任…

现代网络负载均衡与代理导论

大家觉得有有参考意义和帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; Service mesh 是近两年网络、容器编排和微服务领域最火热的话题之一。Envoy 是目前 service mesh 数据平面的首选组件。Matt Klein 是 Envoy 的设计者和核心开发。 文章循序渐进&#xff0…

Kubernetes Gateway API-2-跨命名空间路由

1 跨命名空间路由 Gateway API 具有跨命名空间路由的核心支持。当多个用户或团队共享底层网络基础设施时,这很有用,但必须对控制和配置进行分段,以尽量减少访问和容错域。 Gateway 和 Route(HTTPRoute,TCPRoute,GRPCRoute) 可以部署到不同的命名空间中,路由可以跨命名空间…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构&#xff1a;List、Set和Queue。本文将详细阐述这些数据类型的各自实现&#xff0c;并按照线程安全性进行分类&#xff0c;分别介绍非线程安全与线程安全的实现方…

集成方案 | Docusign + 蓝凌 EKP,打造一站式合同管理平台,实现无缝协作!

本文将详细介绍 Docusign 与蓝凌 EKP 的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 在当今数字化办公环境中&#xff0c;企业对于提高工作效率和提升用户体验的需求日益迫切。蓝凌…

突围边缘:OpenAI开源实时嵌入式API,AI触角延伸至微观世界

当OpenAI宣布开源其名为openai-realtime-embedded-sdk的实时嵌入式API时&#xff0c;整个科技界都为之震惊。这一举动意味着&#xff0c;曾经遥不可及的强大AI能力&#xff0c;如今可以被嵌入到像ESP32这样的微型控制器中&#xff0c;真正地将AI的触角延伸到了物联网和边缘计算…

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…

使用Webpack构建微前端应用

英文社区对 Webpack Module Federation 的响应非常热烈&#xff0c;甚至被誉为“A game-changer in JavaScript architecture”&#xff0c;相对而言国内对此热度并不高&#xff0c;这一方面是因为 MF 强依赖于 Webpack5&#xff0c;升级成本有点高&#xff1b;另一方面是国内已…

[bug]java导出csv用Microsoft Office Excel打开乱码解决

[bug]java导出csv用Microsoft Office Excel打开乱码 ‍ 现象 首先这个csv文件用macbook自带的 "Numbers表格" 软件打开是不乱码的, 但是使用者是Windows系统,他的电脑没有"Numbers表格"工具, ​​ 他用Microsoft Office Excel打开之后出现乱码,如下图…

关于分布式数据库需要了解的相关知识!!!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于关于分布式数据库方面的相关内容&a…

tortoisegit推送失败

tortoisegit推送失败 git.exe push --progress -- "origin" testLidar:testLidar /usr/bin/bash: gitgithub.com: No such file or directory fatal: Could not read from remote repository. Please make sure you have the correct access rights and the reposit…

moviepy将图片序列制作成视频并加载字幕 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

清空DNS 缓存

如果遇到修改了host文件&#xff0c;但是IP和域名的映射有问题的情况&#xff0c;可以尝试刷新DNS缓存。 ipconfig/flushdns win建加R建&#xff0c;然后输入cmd&#xff0c;然后回车 然后回车&#xff0c;或者点击确定按钮。 出现如下所示标识清空DNS 缓存成功。

2024最新鸿蒙开发面试题合集(二)-HarmonyOS NEXT Release(API 12 Release)

上一篇面试题链接&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/144685078 1. 鸿蒙简单介绍和发展历程 HarmonyOS 是新一代的智能终端操作系统&#xff0c;为不同设备的智能化、互联与协同提供了统一的语言。带来简洁&#xff0c;流畅&#xff0c;连续&#xff0…

Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制

引言 在嵌入式开发中&#xff0c;构建效率直接影响项目的开发进度和质量。Yocto 项目通过其核心工具 BitBake 提供了灵活而强大的构建能力。然而&#xff0c;OpenEmbedded 构建系统的传统设计是从头开始构建所有内容&#xff08;Build from Scratch&#xff09;&#xff0c;这…

idea 8年使用整理

文章目录 前言idea 8年使用整理1. 覆盖application配置2. 启动的时候设置编辑空间大小&#xff0c;并忽略最大空间3. 查询类的关系4. 查看这个方法的引用关系5. 查看方法的调用关系5.1. 查看被调用关系5.2. 查看调用关系 6. 方法分隔线7. 选择快捷键类型8. 代码预览插件9. JReb…

04软件测试需求分析案例-用户登录

通读文档&#xff0c;提取信息&#xff0c;提出问题&#xff0c;整理为需求。 从需求规格说明、设计说明、配置说明等文档获取原始需求&#xff0c;通读原始需求&#xff0c;分析有哪些功能&#xff0c;每种功能要完成什么业务&#xff0c;业务该如何实现&#xff0c;业务逻辑…

【MySQL】踩坑笔记——保存带有换行符等特殊字符的数据,需要进行转义保存

问题描述 从DBeaver中导出了部分业务数据的 insert sql&#xff0c;明明在开发、测试环境都可以一把执行通过&#xff0c;却在预发环境执行前的语法检查失败了&#xff0c;提示有SQL语法错误。 这条SQL长这样&#xff0c;default_sql是要在odps上执行的sql语句&#xff0c;提…