@whitesev/utils
Version:
一个常用的工具库
125 lines (122 loc) • 3.13 kB
text/typescript
import type { ProgressParamConfig } from "./types/Progress";
import { Utils } from "./Utils";
class Progress {
#config: ProgressParamConfig = {
/**
* canvas元素节点
*/
canvasNode: null as any,
/**
* 绘制角度
*/
deg: 95,
/**
* 进度
*/
progress: 0,
/**
* 绘制的线宽度
*/
lineWidth: 10,
/**
* 绘制的背景颜色
*/
lineBgColor: "#1e637c",
/**
* 绘制的线的颜色
*/
lineColor: "#25deff",
/**
* 绘制的字体颜色
*/
textColor: "#000000",
/**
* 绘制的字体大小(px)
*/
fontSize: 22,
/**
* 绘制的圆的半径
*/
circleRadius: 50,
};
#ctx: CanvasRenderingContext2D = null as any;
#width: number = null as any;
#height: number = null as any;
/**
*
* @param paramConfig 配置信息
*/
constructor(paramConfig: ProgressParamConfig) {
this.#config = Utils.assign(this.#config, paramConfig);
if (!(this.#config.canvasNode instanceof HTMLCanvasElement)) {
throw new Error(
"Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement"
);
}
this.init();
}
/**
* 初始化
*/
private init() {
/* 获取画笔 */
let ctx = this.#config.canvasNode.getContext("2d");
if (ctx == null) {
throw new Error("Utils.Progress 获取画笔失败");
}
this.#ctx = ctx;
/* 元素宽度 */
this.#width = this.#config.canvasNode.width;
/* 元素高度 */
this.#height = this.#config.canvasNode.height;
/* 清除锯齿 */
if (window.devicePixelRatio) {
this.#config.canvasNode.style.width = this.#width + "px";
this.#config.canvasNode.style.height = this.#height + "px";
this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
}
/* 设置线宽 */
this.#ctx.lineWidth = this.#config.lineWidth;
}
/**
* 绘制
*/
draw() {
let degActive = (this.#config.progress * 360) / 100;
/* 清除画布 */
this.#ctx.clearRect(0, 0, this.#width, this.#height);
/* 开始绘制底圆 */
this.#ctx.beginPath();
this.#ctx.arc(
this.#width / 2,
this.#height / 2,
this.#config.circleRadius,
1,
8
);
this.#ctx.strokeStyle = this.#config.lineBgColor;
this.#ctx.stroke();
/* 开始绘制动态圆 */
this.#ctx.beginPath();
this.#ctx.arc(
this.#width / 2,
this.#height / 2,
this.#config.circleRadius,
-Math.PI / 2,
(degActive * Math.PI) / 180 - Math.PI / 2
);
this.#ctx.strokeStyle = this.#config.lineColor;
this.#ctx.stroke();
/* 获取百分比 */
let txt = parseInt(this.#config.progress.toString()) + "%";
this.#ctx.font = this.#config.fontSize + "px SimHei";
/* 获取文本宽度 */
let w = this.#ctx.measureText(txt).width;
let h = this.#config.fontSize / 2;
this.#ctx.fillStyle = this.#config.textColor;
this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h / 2);
}
}
export { Progress };